문제

제로 예외로 나누기가 잡히는 지 확인하기 위해이 코드를 시도하고있었습니다.

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에서는 컴파일러 옵션이 될 수 있습니다. 그러나 표준으로 예외는 버리지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top