SEH를 사용한 코드

  1. void some_func5(DWORD *some_ptr)  
  2. {  
  3.     __try 
  4.     {  
  5.         *some_ptr = 0x12345678;  
  6.     }  
  7.     __except(EXCEPTION_EXECUTE_HANDLER)  
  8.     {  
  9.         SetLastError(ERROR_INVALID_ACCESS);  
  10.     }      
  11. }  


<리스트 4>와 동일한 코드를 SEH로 작성한 것이 <리스트 5>의 코드다. 간단한 코드이기 때문에 코드만으로는 예외처리의 장점을 알기가 쉽지 않다. 단지 명확한 한 가지 단점은 복잡한 조건을 미리 생각하지 않아도 된다는 점이다. __try, __except 블록으로 인해 너무 복잡해 보인다거나, 예외처리 때문에 늦어진다고 불평을 할 수 있다. 하지만 이는 예외 처리에 대한 메커니즘을 정확하게 이해하지 못해서 발생하는 오류다. 우선 __try, __except 블록에 대해서 살펴보자. 분명히 <리스트 4>에는 그러한 것이 없다. 하지만 진짜 없는 것은 아니다. IsBadWritePtr이란 함수 속에 그 블록이 숨겨져 있을 뿐이다. 그렇다면 성능은 어떨까? <리스트 4>의 코드는 오류가 있건 없건 항상 IsBadWritePtr을 호출한다. 반면에 <리스트 5>의 코드는 그런 사전 검사에 드는 비용이 없다. 예외가 발생했을 때만 예외처리 코드가 수행된다. 따라서 <리스트 5>의 코드가 더 효율적이다.

SEH 사용법
http://serious-code.net/moin.cgi/SEH

A Crash Course on the Depths of Win32™ Structured Exception Handling
http://www.microsoft.com/msj/0197/exception/exception.aspx


위의 글은 제가 필요한 부분만 꺼내온 것이고 자세한 설명은 트랙백 주소의 블로그로 가보면 자세한 설명이 되어있습니다. ^^
예외처리를 할 때에 저와 같은 초보 프로그래머들은 assert나 null만 짚고 넘어가는 경우가 많습니다.
그렇지만 다른 버그를 잡을 수 없지요 .
관련 글을 보면 예외처리에 대해 상세히 잘 설명되어 있습니다. ^^
영진님의 노하우가 팍팍 느껴지는군요..
항상 좋은 글에 감사할 따름입니다. ^^
아.. 최근에 감기에 걸려서 죽겄네요 ㅠ
빨리 나았으면 좋겠습니다.
다른 분들도 감기 조심하시기를...

관련 글입니다. http://www.jiniya.net/tt/655

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by BreathAir