我可以为抛出bad_cast时的情况安装自定义处理程序吗?

时间:2012-03-16 11:10:52

标签: c++ visual-c++ exception error-handling dynamic-cast

如果dynamic_cast<SomeType&>失败,则会抛出bad_cast异常。在我的代码中有一个单独的异常层次结构,而bad_cast不在该层次结构中,因此我的代码将不会处理bad_cast。我可能会抛出其他一些例外吗?

我的意思是我想编写一个这样的自定义处理程序:

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

以某种方式在C ++运行库中注册它

RegisterMyBadCastHandler( &OnBadCast );

以便调用此处理程序而不是抛出bad_cast

这可能吗?

3 个答案:

答案 0 :(得分:1)

我认为你不能改变这种行为。

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

答案 1 :(得分:1)

错误的强制转换通常表示程序中存在错误(例如,超出范围或内存不足),因此根本不应该被捕获(或者可能在顶层)。如果你想在dynamic_cast成功分支,那么在指针形式中测试null:

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

如果你想要一个特殊的处理程序,那么你能做的最好就是:

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

    my_handler();
}

其中my_handler应该杀死程序(也许记录错误)。但是在这里,您可能更喜欢使用普通的dynamic_cast<T&>表单,让std::bad_cast冒泡并记录在顶层。这也可以在调试器中发挥更好的作用,调试器可以设置为在转换失败时停止。

您在评论中描述的案例非常罕见,值得特别考虑,例如:

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

可能用来表示一些上游战略家应该尝试另一种方法。

答案 2 :(得分: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;
}