코드의 예외를 포착합니다
-
05-07-2019 - |
문제
제로 예외로 나누기가 잡히는 지 확인하기 위해이 코드를 시도하고있었습니다.
int main(int argc, char* argv[])
{
try
{
//Divide by zero
int k = 0;
int j = 8/k;
}
catch (...)
{
std::cout<<"Caught exception\n";
}
return 0;
}
VC6을 사용하여 이것을 준수하면 캐치 핸들러가 실행되었고 출력은 "예외"였습니다. 그러나 VS2008을 사용 하여이 프로그램을 컴파일하면 캐치 블록을 실행하지 않고 프로그램이 충돌했습니다. 차이의 이유는 무엇입니까?
해결책
프로젝트에서 구조화 된 예외 처리 -> 속성 -> 구성 속성 -> C/C ++ -> 코드 생성 -> C ++ 예외를 활성화합니다.
제외한 시도를 사용하십시오. 이상적으로는 예외 코드를 확인하는 필터를 사용하면 잡기를 원한다면 상수 신호를 반환합니다. 나는 여기에서 그것을 건너 뛰었지만 여기 필터의 예.
#include <iostream>
#include <windows.h>
int main(int argc, char* argv[])
{
__try
{
//Divide by zero
int k = 0;
int j = 8/k;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
if(GetExceptionCode()==EXCEPTION_INT_DIVIDE_BY_ZERO)
std::cout << "Caught int divison exception\n";
else
std::cout << "Caught exception\n";
system("pause");
}
return 0;
}
다른 팁
Microsoft와 관련된 운영 체제 인 Microsoft의 구조화 된 예외 처리 (SEH) 레이어에 의해 생성 된 예외를 포착하고 있습니다. Mykola가 제안한 것처럼 컴파일러 옵션과 함께 바이올린이 필요할 수도 있지만이 코드는 다른 운영 체제 나 Windows에서 실행되는 다른 컴파일러에게는 휴대 할 수 없습니다.
C/C ++의 코드 생성에 따라 프로젝트 속성으로 이동하면 "C ++ 예외 활성화"가 있습니다. 이 옵션을 "예, SEH 예외"로 변경하십시오.
당신은 다음을 사용하여 이러한 종류의 예외 만 잡을 수있을 것입니다.
try {} catch(...) {}
(타원과 함께)__try {} __except() {}
(적절한 필터가 있습니다__except
)- 사용하여
SetUnhandledExceptionFilter()
유효한 값의 경우 __except
여기를 봐
Visual Studio Case에서는 컴파일러 옵션이 될 수 있습니다. 그러나 표준으로 예외는 버리지 않습니다.
제휴하지 않습니다 StackOverflow