2010-05-06 2 views

답변

33

이들은 유닉스 신호에 상응하는 Win32이며, 액세스 위반, 불법적 인 명령, 0으로 나누기와 같은 CPU 예외를 포착 할 수 있습니다.

올바른 컴파일러 옵션 (Visual C++의 경우/EHa)을 사용하면 C++ 예외는 C++ (사용자) 예외와 SEH (OS) 예외에 대해 스택 unwinding이 올바르게 작동하는 것과 동일한 메커니즘을 사용합니다.

C++ 예외와 달리 SEH는 입력되지 않지만 예외 코드 (원인)와 오류 코드에 대한 추가 정보 및 오류 발생시 보유한 레지스터에 대한 추가 정보를 공유합니다. 자세한 내용은 GetExceptionCodeGetExceptionInformation을 참조하십시오.

또한 SEH에는 예외를 기록하거나 처리 할 수있게 해주는 "first-chance"처리가 있습니다. 해제하면 모든 로컬 변수가 삭제됩니다.

+1

SEH 예외가 C++ 예외처럼 처리하기에 안전하지 않으므로 기본값이 C++ 예외와 같은 SEH 예외 처리에서 변경되었습니다. SEH 예외는 일반적으로 액세스 위반과 같은 것으로 이러한 조건에서 C++ 푸시를 시도하는 것은 불가능하며 프로그램이 종료 될 수 있습니다. –

+3

액세스 위반을 푸는 것에 대해 본질적으로 안전하지 않은 것은 없습니다. 물론 액세스 위반이 내부 데이터 구조 (특히 호출 스택 정보에 영향을주는 스택 오버플로)로 인해 발생하는 경우 unwinding은 실패 할 가능성이 있지만 대부분은 아니지만 SEH 예외 중 많은 부분이 실제로 스택을 반영하지 않습니다 부패. –

+0

SEH의 무시 무시한 부작용에 대한 http://stackoverflow.com/questions/4414027/visual-c-unmanaged-code-use-eha-or-eh-sc-for-c-exceptions 무시 된 줄임표가있는 예외 - 예외 예 : catch (...) {}) –

20

그들은 표준 C++의 일부가 아니라는 것을 알아야합니다. 그들은 Microsoft 발명품이며 C++ 이외의 다른 언어로도 사용될 수 있습니다.

16

A Crash Course on the Depths of Win32™ Structured Exception Handling

는 그 기사는 SEH와 속도를 점점에 참조 입니다. 13 년이 지난 지금도 여전히 최고입니다.

SEH vs. C++ Exception Handling Differences에 대한 MSDN 전용 주제가 있습니다. SEH 논의되고있는 경우 C++ 개발자가 알아야 할

어떤 것들은 :

쓰기 C/C++ SEH Exception Handlers :

__try 
{ 
    // guarded code 
} 
__except (expression) 
{ 
    // exception handler code 
} 

이, 특정 확장자는 MS 하지 C++ 예외 처리이다 똑바로 가라 앉는 SEH. 그것은 당신의 평범한 C++ 예외와 매우 다른 방식으로 작동합니다. SEH를 잘 이해해야합니다.

쓰기 C/C++ SEH Termination Handlers는 :

SEH 핸들러와 같은
__try { 
    // guarded code 
} 
__finally (expression) { 
    // termination code 
} 

같은, C++ 예외 의미와 혼동하지 마십시오. SEH에 대해 잘 알고 있어야합니다.

_set_se_trasnlator : 비동기 예외가 사용되는 경우 SEH 예외를 C++ 형식 예외로 변환하는 함수입니다. /EHa.

마지막으로 개인적인 의견 : C++ 개발자는 SEH를 알고 있어야합니까? 첫 신인 후 .ecxr을 사용하면 푸시가 밀려 올 때 C++ 예외가 사용자의 편의를 위해 제공되는 환상임을 이해할 것입니다. 진행되는 유일한 일은 SEH입니다.

+7

'__finally'에는'(표현식)'이 없습니다. – Abyx

24

나는 최근에 특히 때문에 나는 모든 개발자가 알아야 할 생각 SEH의 한 기능으로, SEH에 의해 간접적으로 야기 된 문제가 있었다 :

SEH는 그래서 만약 당신이 소멸자가 호출되지 않습니다 사용하는 경우 소멸자의 정리 코드는 정리되지 않습니다.

우리의 문제는 생성자에 Lock이있는 객체로 둘러싸인 크리티컬 섹션과 소멸자에서 잠금 해제로 인해 발생했습니다.

우리는 교착 상태가 발생하여 코드와 덤프 및 디버깅을 한주에 한 번 조사한 결과 약 1 주일이 지난 후에 COM에서 처리되어 Critical 섹션을 잠근 상태로 유지하십시오. 프로젝트 속성에서 VS의 컴파일 플래그를 변경하여 SEH에 대해서도 소멸자를 실행하고 문제를 해결하도록 알려줍니다.

코드에서 SEH를 사용할 수 없더라도 예기치 않은 동작을 일으킬 수있는 (예 : COM) 라이브러리를 사용하고있을 수 있습니다.

관련 문제