모든 C++ 개발자는 Structured Exceptions에 대해 중요한 점을 알고 있습니까?C++의 구조적 예외 (SEH)에 대해 알아야 할 사항은 무엇입니까?
답변
이들은 유닉스 신호에 상응하는 Win32이며, 액세스 위반, 불법적 인 명령, 0으로 나누기와 같은 CPU 예외를 포착 할 수 있습니다.
올바른 컴파일러 옵션 (Visual C++의 경우/EHa)을 사용하면 C++ 예외는 C++ (사용자) 예외와 SEH (OS) 예외에 대해 스택 unwinding이 올바르게 작동하는 것과 동일한 메커니즘을 사용합니다.
C++ 예외와 달리 SEH는 입력되지 않지만 예외 코드 (원인)와 오류 코드에 대한 추가 정보 및 오류 발생시 보유한 레지스터에 대한 추가 정보를 공유합니다. 자세한 내용은 GetExceptionCode
및 GetExceptionInformation
을 참조하십시오.
또한 SEH에는 예외를 기록하거나 처리 할 수있게 해주는 "first-chance"처리가 있습니다. 해제하면 모든 로컬 변수가 삭제됩니다.
그들은 표준 C++의 일부가 아니라는 것을 알아야합니다. 그들은 Microsoft 발명품이며 C++ 이외의 다른 언어로도 사용될 수 있습니다.
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입니다.
'__finally'에는'(표현식)'이 없습니다. – Abyx
나는 최근에 특히 때문에 나는 모든 개발자가 알아야 할 생각 SEH의 한 기능으로, SEH에 의해 간접적으로 야기 된 문제가 있었다 :
SEH는 그래서 만약 당신이 소멸자가 호출되지 않습니다 사용하는 경우 소멸자의 정리 코드는 정리되지 않습니다.
우리의 문제는 생성자에 Lock이있는 객체로 둘러싸인 크리티컬 섹션과 소멸자에서 잠금 해제로 인해 발생했습니다.
우리는 교착 상태가 발생하여 코드와 덤프 및 디버깅을 한주에 한 번 조사한 결과 약 1 주일이 지난 후에 COM에서 처리되어 Critical 섹션을 잠근 상태로 유지하십시오. 프로젝트 속성에서 VS의 컴파일 플래그를 변경하여 SEH에 대해서도 소멸자를 실행하고 문제를 해결하도록 알려줍니다.
코드에서 SEH를 사용할 수 없더라도 예기치 않은 동작을 일으킬 수있는 (예 : COM) 라이브러리를 사용하고있을 수 있습니다.
- 1. F # CTP에 대해 알아야 할 사항은 무엇입니까?
- 2. 동적 프로그래밍에 대해 알아야 할 사항은 무엇입니까?
- 3. UDP 소켓 프로그래밍에 대해 알아야 할 사항은 무엇입니까?
- 4. Java 개발 스택의 구성 요소에 대해 알아야 할 사항은 무엇입니까?
- 5. Ruby를 사용하기 전에 알아야 할 사항은 무엇입니까?
- 6. 다형성에 대해 알아야 할 C++의 개념
- 7. Facebook에서 FBML으로 작업 할 때 알아야 할 사항은 무엇입니까?
- 8. PowerBuilder 변환 프로젝트를 추정 할 때 알아야 할 사항은 무엇입니까?
- 9. .NET 세계의 프런트 엔드 개발자 - 알아야 할 사항은 무엇입니까?
- 10. RIA에 대해 알아야 할 내용
- 11. 세션 변수를 사용할 때 알아야 할 사항은 무엇입니까?
- 12. 자동 파이썬 배포를 위해 알아야 할 사항/알아야 할 사항은 무엇입니까?
- 13. 64 비트 응용 프로그램 개발시 알아야 할 사항은 무엇입니까?
- 14. Objective C++에서 메모리를 관리하기 위해 알아야 할 사항은 무엇입니까?
- 15. 엔트리 레벨 레일스 작업을 수행하기 전에 알아야 할 사항은 무엇입니까?
- 16. Android 개발자가 iOS로 이전 - 알아야 할 사항은 무엇입니까?
- 17. 시스템 관리자가 Mercurial에 대해 알아야 할 사항은 무엇입니까? 어떤 포트가 사용합니까?
- 18. ImageMagick - 내가 알아야 할 것은 무엇입니까?
- 19. 구조적 쿼리 언어에서 "구조적"이란 무엇입니까?
- 20. Obj-C의 예외 처리
- 21. WPF - 구조적 예외 처리없이 리소스가 있는지 확인하십시오.
- 22. 응용 프로그램을 Citrix로 이식 할 때 알아야 할 기본 사항은 무엇입니까?
- 23. Oracle 10g에서 9i로 다운 그레이드 할 때 알아야 할 사항은 무엇입니까?
- 24. SQL * Loader에서 이식 가능하지 않은 데이터 유형 사용에 관해 알아야 할 사항은 무엇입니까?
- 25. 데이터베이스를 사용하는 Java 응용 프로그램을 만들기 위해 알아야 할 사항은 무엇입니까?
- 26. SFML에서 알아야 할 문제점 및 문제점은 무엇입니까?
- 27. Groovy는 알아야 할 langage입니까?
- 28. .net의 중첩 된 마스터 콘텐츠 페이지로 콘텐츠 페이지를 변환하기 전에 알아야 할 사항은 무엇입니까?
- 29. 드루팔 (Drupal의 XML-RPC 및 BlogAPI 구현에서 알아야 할 사항은 무엇입니까?
- 30. 상호 운용 가능한 WCF 웹 서비스를 개발할 때 알아야 할 사항은 무엇입니까?
SEH 예외가 C++ 예외처럼 처리하기에 안전하지 않으므로 기본값이 C++ 예외와 같은 SEH 예외 처리에서 변경되었습니다. SEH 예외는 일반적으로 액세스 위반과 같은 것으로 이러한 조건에서 C++ 푸시를 시도하는 것은 불가능하며 프로그램이 종료 될 수 있습니다. –
액세스 위반을 푸는 것에 대해 본질적으로 안전하지 않은 것은 없습니다. 물론 액세스 위반이 내부 데이터 구조 (특히 호출 스택 정보에 영향을주는 스택 오버플로)로 인해 발생하는 경우 unwinding은 실패 할 가능성이 있지만 대부분은 아니지만 SEH 예외 중 많은 부분이 실제로 스택을 반영하지 않습니다 부패. –
SEH의 무시 무시한 부작용에 대한 http://stackoverflow.com/questions/4414027/visual-c-unmanaged-code-use-eha-or-eh-sc-for-c-exceptions 무시 된 줄임표가있는 예외 - 예외 예 : catch (...) {}) –