2012-03-16 4 views
0

dynamic_cast<SomeType&>이 실패하면 bad_cast 예외가 발생합니다. 내 코드에는 예외 클래스가 별도로 있으며 bad_cast은 해당 계층에 없으므로 코드가 bad_cast을 처리하지 않습니다. 대신에 다른 예외가 발생할 수 있습니까? 슬로우 ++ 런타임이 핸들러 대신 bad_cast의 호출되도록bad_cast가 발생했을 때 사용자 지정 처리기를 설치할 수 있습니까?

RegisterMyBadCastHandler(&OnBadCast); 

에게

void OnBadCast() 
{ 
    throw MyException("Bad cast"); 
} 

어떻게 든 C에 등록 :

는 나는이 같은 사용자 정의 핸들러를 작성하고 싶은 말은 .

그럴 수 있습니까?

+0

동적 캐스트를 래핑하는 자체 동적 캐스트를 만들고 예외를 변환 할 수 있습니다. – Dani

+1

포착하지 마십시오. try-and-cast를하고 싶다면'dynamic_cast'의 포인터 형식을 사용하고 캐스트 후에 null을 테스트하십시오. 그런 다음, 유형이 예상되는 경우 참조 양식을 사용하고, 'std :: bad_cast'는 프로그램에 버그가 있음을 나타내는 것입니다. 이 경우 프로그램을 멈추고 중지 시키길 원합니다. –

+0

@Alexandre C .: 프로그램을 즉시 중지하는 것이 항상 선택 가능한 것은 아닙니다. 예외를 기록하고 다음 항목으로 진행하는 것이 더 나을 때가 있습니다. – sharptooth

답변

1

이 동작을 변경할 수 있다고 생각하지 않습니다.

당신이 이 할 수있는 무엇

그러나, 자신의 캐스터를 사용할 수 있습니다 :

template<class T, class E> T myCast(E expr) 
{ 
    try 
    { 
     return dynamic_cast<T>(expr); 
    } 
    catch(std::bad_cast e) 
    { 
     // custom handler 
    } 
}; 
0

당신이 그들을 처리하기 위해 같은 계층의 예외가 필요하지 않습니다. 적어도 VC++에는 없습니다. 다른 유형의 오류를 처리하는 것에 대해 걱정할 필요가있는 경우 다음과 같이하십시오. 이 답변으로는 충분하지 않은 경우 다른 사람들이 작업하고있는 제한 사항을 고려해 볼 때 탁월합니다.하지만 bad_cast가 언제 던져 지는지, 그렇지 않은지는 메모 해 두십시오. http://answers.yahoo.com/question/index?qid=20071106101012AAggZAk

#include <iostream> 
#include <exception> 

using namespace std; 

class my_exception { 
public: 
    explicit my_exception() {}; 
    const char* msg() const { return "my_exception"; } 
}; 

int main() 
{ 

    try { 

     // comment either line. 
     throw std::exception("std::exception"); 
     throw my_exception(); 

    } 
    catch (const std::exception& e) 
    { 
     cout << e.what() << endl; 
    } 
    catch (const my_exception& e) 
    { 
     cout << e.msg() << endl; 
    } 

    return 0; 
} 
1

나쁜 캐스트는 보통 (범위를 벗어난, 또는 메모리 부족. 예를 들어 같은) 프로그램의 버그를 표시하고, 따라서 (혹은 최상위에) 전혀 잡은 할 수 없습니다. 당신이 dynamic_cast의 성공을 분기 할 경우, 포인터 형태로 널 (null) 테스트 :

template <typename T, typename U> 
T& polymorphic_cast(U& x) 
{ 
    if (T* p = dynamic_cast<T*>(&x)) return *p; 

    my_handler(); 
} 
: 당신이 특별한 핸들러를 원하는 경우

if (T* p = dynamic_cast<T*>(some_ptr)) 
{ 
    // Do something with p 
} 

, 당신이 할 수있는 최선은 다음과 이렇게이다

여기서 my_handler은 프로그램을 죽이고 (아마도 오류를 기록하기로되어 있습니다.) 그러나 여기서 평범한 dynamic_cast<T&> 양식을 선호한다면 std::bad_cast 거품이 나오고 최상위 레벨에 기록됩니다. 이것은 또한 캐스트가 실패한 지점에서 멈추도록 설정 될 수있는 디버거로 더 잘 재생됩니다. 당신이 당신의 의견에 설명처럼

케이스

if (auto p = dynamic_cast<foo*>(q)) { do_something(); } 
else { throw bail_me_out_of_here(); } 

는 다른 방법을 시도해야한다는 일부의 상류 전략가를 표시하는 데 이용 될 수있다 : 예를 특별한 고려를 보증 할만큼 드물다.

관련 문제