2014-06-25 2 views
4

아래의 간단한 프로그램을 실행하면 Cygwin 및 Ubuntu OS에서 다른 터미널 출력을 얻게됩니다.Cygwin에서 실행 된 프로그램이 예외를보고하지 않습니다.

Cygwin에서 우분투와 달리 예외가 발생했다는 메시지가 표시되지 않습니다. 그 이유가 무엇일까요? Cygwin에서 예외를 처리 할 수 ​​있도록 다운로드해야하는 것이 있습니까?

GCC 4.9.0에서 Cygwin 버전 1.7.30을 사용하고 있습니다. 우분투에는 GCC 4.8.1 버전 13.10이 있습니다. 나는이 경우 컴파일러의 차이가 중요한지 의심 스럽다.

+1

같은 문제에 직면 해 주셔서 감사합니다. – stella

답변

3

예외를 catch하지 않으므로 동작은 구현/런타임에 따라 다릅니다. 이것은 Linux와 cygwin에서 다르게 구현되는 것 같습니다.

직접 예외를 잡거나 this 질문에 대한 답변에서 설명한 것과 같은 것을 사용해야합니다.

6

이 경우에는 동작이 정의되지 않았습니다. Linux의 glibc가 실제로 수행하는 "예외를 잡지 않았습니다"에 대한 텍스트를 발행하기 위해 C++ 런타임의 "친절 함"에 의존하고 있습니다. 분명히 Cygwin은 그렇지 않습니다.

을 처리하려면 try/catch에 주 코드를 입력하십시오.

int main() { 
    try 
    { 
     const double input = -1; 
     double result = square_root(input); 
     printf("Square root of %f is %f\n", input, result); 
     return 0; 
    } 
    catch(...) 
    { 
     printf("Caught exception in main that wasn't handled..."); 
     return 10; 
    } 
} 

좋은 솔루션, 매트 McNabb에 의해 제안은 "기본 이름을"로하고, 같은 somethting 않습니다 우리는 0보다 다른 값을 반환

int actual_main() { 
    const double input = -1; 
    double result = square_root(input); 
    printf("Square root of %f is %f\n", input, result); 
    return 0; 
} 

int main() 
{ 
    try 
    { 
     return actual_main(); 
    } 
    catch(std::exception e) 
    { 
     printf("Caught unhandled std:exception in main: %s\n", e.what().c_str()); 
    } 
    catch(...) 
    { 
     printf("Caught unhandled and unknown exception in main...\n"); 
    } 
    return 10; 
} 

는 "실패"를 표시하기 위해 - 적어도 Cygwin은 이미 그렇게 할 것으로 기대합니다.

+0

다양한 옵션이 많이 있습니다. 예외는'std :: exception'와 관련이 없으므로 궁극적으로 어떤 예외도 잡히지 않도록'catch (...) '가 필요합니다. 나는 그러한 해결책을 포함시켰다. –

+0

'std :: set_terminate()'를 내 자신의 함수로 설정하려고 시도했지만 그 함수가 호출되지 않는 것 같습니다. C++ 11에서 작동하지 않아야합니까? – Hugues