2010-02-23 9 views
6

가능한 중복 :
Determining exception type after the exception is caught?catch (...) 블록에서 현재 예외를 어떻게 확인할 수 있습니까?

question 위로 다음은, 내가 캐치 (...) 블록에서 현재 예외를 인쇄하고 싶습니다 - 단지 로깅 용. 그 중 하나의 대답은 표준 방법이 없다고 말하지만 대답을 거부하는 것을 좋아하지 않습니다 :-)

current_exception()은 웹상의 여러 곳에서 언급되었지만 분명히 그렇지 않은 함수입니다 잘 지원된다. 이것에 대한 어떤 생각? 결국, 심지어 C는 errno입니다.

간단하게 ** throw *를 사용하여 다시 throw 할 수 있기 때문에 예외 객체를 사용할 수 있어야합니다.

MSVS 9.0을 사용 중입니다.

편집 : 결론은 이것이 가능하지 않은 것 같습니다.

+4

이 질문이 귀하가 참조한 질문과 다른 점은 없습니다. 당신이 싫어하기 때문에 대답은 다시 물어볼 필요가 없습니다. –

+0

나는 Mark에 동의한다. 하지만 어쩌면 당신은 받아 들일 수있는 대답의 기술을 사용하여 std :: exception & catch 및 CException *으로 잡힐 수있는 MFC를 비롯하여 모든 일반적인 예외의 기본 클래스를 잡을 수 있다는 것을 알지 못합니다. –

+0

질문은 약간 다릅니다 : 다른 하나는 예외의 유형을 식별하는 것에 대해 묻지 만 예외에 대해서는 최대한 많은 정보를 인쇄하려고합니다. –

답변

0

RTTI를 켜고 typeOf 기능을 사용할 수 있습니다. current_exception은 순전히 stl 함수이며 stl 예외에만 적용됩니다.
예외 유형별로 다른 catch(exctype)을 사용하는 것이 좋습니다. 이것은 인생을 훨씬 쉽게 만들 것입니다.

+2

'catch (...)'는 참조 할 객체를 제공하지 않으므로 유형을 알 수 없습니다. RTTI는 int와 같은 POD 유형에서 작동합니까? –

1

마찬가지로 alemjerus 이미 말했다 : current_exception stl 예외에 대해서만 작동합니다. 당신은 또한 쓸 수있는 다양한 STL과 오류를 효율적으로 활용하려면 다음

#include <stdexcept> 
#include <exception> //ecxeption (base class) 
#include <new>  //bad_alloc 
#include <typeinfo> //bad_cast und bad_typeid 
#include <ios>  //ios_base::failure  

... 

try 
{ 
    ... 
} 
catch(std::exception& e) 
{ 
    cerr<<"Error: "<<e.what()<<endl; 
} 
1

가 발생 될 수있는 예외를 결정하고 그들 모두를 커버 공통 기본 유형의 집합을 잡으려고 캐치 핸들러 세트를 사용합니다. 캐치에서 예외 객체 (...)는 이식 할 수 없으며, 모두가 마이크로 소프트 컴파일러 또는 GCC를 사용에서 내가 아는 한, 그것을 할 수 없습니다를 얻기에 관해서는


. 어쨌든 예외 객체가 catch (...) 핸들러에 여전히 존재한다고 생각합니까?

+2

> "어쨌든 예외 객체가 catch (...) 처리기에 여전히 존재한다고 생각합니까?" 단순한 "던짐"으로 다시 올릴 수 있기 때문에 개체가 어딘가에 있어야합니다. –

+0

catch (...)가 최상위 레벨 catch 처리기 인 경우? as-if 규칙은 컴파일러가 편리 할 때마다 객체를 파괴 할 수있는 권한을 부여합니다. 나는 그것이 실제로 일어나는 것을 의심한다. –

7

코드를 작성할 때 알고있는 예외 만 신경 쓰면 모든 '알려진'예외를 처리 할 수있는 처리기를 작성할 수 있습니다. 트릭은 당신이 catch(...)으로 잡은 후 공지 된 다양한 예외를 포착 예외를 ... 다시 발생하는 것입니다

그래서, 뭔가 같은 :

bool LogKnownException() 
{ 
    try 
    { 
     throw; 
    } 
    catch (const CMyException1 &e) 
    { 
     cerr << "caught a CMyException: " << e << endl; 

     return true; 
    } 
    catch (const Blah &e) 
    { 
     ... 
    } 
    ... etc 

    return false; 
} 
:

try 
{ 
... 
} 
catch(...) 
{ 
    if (!LogKnownException()) 
    { 
     cerr << "unknown exception" << endl; 
    } 
} 

어디 LogKnownException()이 같이 보입니다

관련 문제