2010-06-28 2 views
18

캐치 올 예외를 발견 할 때마다 유용한 정보를 파일에 쓰려면 어떻게해야합니까?캐치 올 예외에 대한 메시지를 얻는 방법

try 
{ 
    //call dll from other company 
} 
catch(...) 
{ 
    //how to write info to file here??????? 
} 
+2

어떤 예외 메시지에서 벗어나시겠습니까? Throw 된 객체가'int' 인 경우는 어떻게 될까요? 'catch (...)'를 호출하면 catch 된 예외에 * 메시지가 있는지 여부를 알 수 없습니다. – jalf

+0

이 질문은 저에게 이상한 생각을주었습니다. (작동하지 않을지라도 그것은 재미있을 것입니다.) template catch (const T & ex) {...} 예외는 런타임 메커니즘보다 많습니다 ... 아니면 그럴 수 있습니까? 예외를 던지거나 올바른 catch 블록으로 분기하는 것과 관련된 스택 풀기 메커니즘은 나에게 마술처럼 보입니다. 아마도 분기 할 올바른 catch 블록은 여전히 ​​컴파일 타임에 결정되므로 모듈 경계를 벗어나는 것이 안전하지 않은 이유 중 하나를 설명 할 수 있습니다. – stinky472

답변

43

... catch 블록에서 정보를 가져올 수 없습니다. 즉 코드는 일반적으로 이와 같은 예외를 처리하는 이유입니다 :

try 
{ 
    // do stuff that may throw or fail 
} 
catch(const std::runtime_error& re) 
{ 
    // speciffic handling for runtime_error 
    std::cerr << "Runtime error: " << re.what() << std::endl; 
} 
catch(const std::exception& ex) 
{ 
    // speciffic handling for all exceptions extending std::exception, except 
    // std::runtime_error which is handled explicitly 
    std::cerr << "Error occurred: " << ex.what() << std::endl; 
} 
catch(...) 
{ 
    // catch any other errors (that we have no information about) 
    std::cerr << "Unknown failure occurred. Possible memory corruption" << std::endl; 
} 
6

catch-all 처리기에서 특정 예외에 대해 알 수있는 방법이 없습니다. 가능하다면 std :: exception과 같은 기본 클래스 예외를 포착 할 수 있다면 가장 좋습니다.

1

나는 그가이 오류가 발생했음을 기록하고 싶어하지만, 특히 정확한 오류를 필요로하지 않는다 (그는 그 경우에 자신의 오류 텍스트를 쓸 것이라고 생각).

위에 게시 된 링크 DumbCoder는 달성하려는 목표를 달성하는 데 유용한 자습서입니다.

3

세부 정보를 얻을 수 없습니다. catch(...)의 요점은 "나는 무슨 일이 일어날 지 모릅니다. 무엇이든 무엇이든 던지십시오." 알려진 예외 유형의 경우 보통 catch '뒤에 catch(...)을 입력하십시오.

8

캐치 예외는 < 예외 >에 정의 된 std :: current_exception() 함수로 액세스 할 수 있습니다. 이것은 C++ 11에서 소개되었습니다. 어쨌든 세부 사항에 얻을 수 있도록

std::exception_ptr current_exception(); 

그러나, 표준 : exception_ptr는 구현 정의 유형이다. typeid(current_exception()).name()은 포함 된 예외가 아니라 exception_ptr를 알려줍니다. 그래서 당신이 할 수있는 유일한 일은 std :: rethrow_exception()입니다. (이 함수는 스레드간에 catch-pass-and-throw를 표준화하는 것으로 보인다.)

관련 문제