C의 예외: __try 대 try/catch/finally
C에서는 try/catch/finally 구문을 사용하여 처리합니다. 예외. 그러나 __try와 같은 밑줄을 사용할 수도 있습니다. 이는 밑줄이 언제 필요한지에 대한 의문을 제기합니다.
Windows 플랫폼: 통합 예외 처리
Windows에서는 구조적 예외를 통해 운영 체제 수준에서 예외가 지원됩니다. 취급(SEH). 이는 Unix 신호와 유사합니다. Windows를 대상으로 하는 컴파일러는 SEH를 활용하여 C 예외를 구현합니다.
비표준 __try 및 __Exception
C에서 SEH 예외를 처리하려면 비표준 __try 키워드를 사용해야 합니다. 시도하는 대신. __out 키워드는 C의 catch와 유사하지만 추가 기능을 제공합니다. 활성 예외를 포착해야 하는지 여부를 결정하는 예외 필터 표현식을 지정할 수 있습니다.
__finally(예외 후 코드 실행의 경우)
__finally 키워드를 사용하면 다음을 수행할 수 있습니다. 예외가 처리된 후 코드를 실행합니다. 이 기능은 표준 C에는 없지만 다른 언어에서는 일반적입니다.
소멸자 호출에 대한 최적화 비활성화
Microsoft 컴파일러는 소멸자를 방지할 수 있는 최적화를 수행합니다. 스택 해제 중에 모든 경우에 호출되지 않습니다. 개체의 수명을 제어하는 범위 내에 throw가 없다고 판단되면 등록 코드를 건너뜁니다. 소멸자 호출을 보장하려면 /EHa 컴파일 옵션을 사용하여 이 최적화를 억제하세요.
SEH 및 C 예외 처리 시연 예시
개념을 설명하기 위한 코드 조각은 다음과 같습니다. 이는 SEH 예외가 C 소멸자 호출을 허용하는 방법과 C 예외가 SEH 위에 구축되는 방법을 보여줍니다. SEH:
#include <iostream> class Example { public: ~Example() { std::cout << "destructed" << std::endl; } }; int filterException(int code, PEXCEPTION_POINTERS ex) { std::cout << "Filtering " << std::hex << code << std::endl; return EXCEPTION_EXECUTE_HANDLER; } void testProcessorFault() { Example e; int* p = 0; *p = 42; } void testCppException() { Example e; throw 42; } int main() { __try { testProcessorFault(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } __try { testCppException(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } return 0; }
출력:
Filtering c0000005 destructed caught Filtering e06d7363 destructed caught
이 예에서는 SEH 및 C 예외 처리를 보여주며 SEH 예외 중에도 소멸자가 호출되는 방법을 보여줍니다.
위 내용은 C에서 try/catch/finally 대신 __try를 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!