문제

다음 catch ()는 호출되지 않습니다.

void test(void)
{
    int i=1,j=0,k;
    try
    {
        k = i/j;
    }
    catch(...)
    {
        ...handle it...
    }
}

이런 종류의 예외를 포착 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

확인해주십시오http://linux.die.net/man/1/gcc이를 처리하기위한 컴파일러 옵션 -Mcheck-Zero-Division이 있습니다.

또는 SIGFPE 핸들러를 설치하는 것은 옵션 일 수 있습니다. Float Div는 0만큼 'fpe_zerodivide'를 생성합니다.

         signal(SIGFPE, (fptr) FPE_ExceptionHandler);

         void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
          {
                switch(nErrType)
                  {
                    case FPE_ZERODIVIDE:  /* ??? */ break;
                }

            }

~부터

대부분의 부동 소수점 시스템은 IEEE 표준을 기반으로합니다. 이는 0으로 분할을 허용합니다. 이것은 숫자의 징후에 따라 양수 무한 또는 음의 무한대를 적절하게 반환합니다. (0/0을 제외하고는 정의되지 않은 NAN을 반환합니다. NANS는 계산이 pssible이 아니라 계산을 계속할 수있는 사례를 효과적으로 알립니다. 지속적인 계산은 새로운 결과를 낳지 않지만 NANS를 계속 반환합니다. 이를 통해 Calculatiosn 내에서 오류 검사를받는 장기 계산 사슬을 수행 할 수 있습니다. 오류 검사는 작업의 끝에서만 수행하면됩니다. 이것은 코드를 훨씬 간단하고 빠르게 만듭니다. 일부 응용 프로그램의 경우 때때로 더 유용 할 수 있습니다. 실제로 문제의 징후가 아닌 "유용한"결과입니다.

다른 팁

아니요 - 예외가 발생하지 않습니다 (신호가 나타납니다 - 아마도 sigfpe). 코드에서 0에 의한 가능한 분열을 확인한 다음 직접 예외를 던져야합니다.

이것이 런타임 오류가 발생하는 경우 ( IEEE 수학에 대한 Lakshmanaraj의 멋진 토론, 일부 컴파일러는 NAN 대신 오류를 강제로 만들 수 있지만 부동 소수점 예외를 던집니다. 신호.

신호는 C ++ 예외와 다른 메커니즘이며 OS 수준에서 처리됩니다. *닉스 신호 메커니즘에 관한 여러 가지 질문이 이미 있습니다.

Windows의 경우 다른 사람에게 물어봐야합니다. Mac OS X는 물론 UNIX 파생 시스템입니다.

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