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

Can I install a custom handler for cases when bad_cast is thrown?

本文关键字:一个 自定义 程序 处理 安装 bad 情况 cast 我可以      更新时间:2023-10-16

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

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

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

并以某种方式将其注册到C++运行时中

RegisterMyBadCastHandler( &OnBadCast );

从而调用该处理程序而不是抛出CCD_ 5。

这可能吗?

我认为你无法改变这种行为。

可以做的是使用你自己的施法器,然而:

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

错误的强制转换通常表示程序中存在错误(例如超出范围或内存不足),因此根本不应该被捕获(或者可能在顶层)。如果您想在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();
}

其中CCD_ 7应该终止程序(并且可能记录错误)。但在这里,您可能更喜欢使用普通的dynamic_cast<T&>表单,让std::bad_cast冒泡并在顶级登录。这在调试器中也发挥得更好,调试器可以设置为在强制转换失败时停止。

像你在评论中描述的情况很少,值得特别考虑,例如:

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

可以用来指示一些上游策略师应该尝试另一种方法。

您不需要在同一层次结构中有异常来处理它们。至少在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;
}