我可以为抛出bad_cast的情况安装一个自定义处理程序吗
Can I install a custom handler for cases when bad_cast is thrown?
如果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;
}
相关文章:
- 编译一个自定义的tf操作,其中输入是5d张量
- C++ 一个自定义类字符串,将其分配给 C 样式字符串
- 我写了一个自定义的咖啡层.但是在训练期间,它说“**层不需要向后计算”
- 这个递归类需要一个自定义析构函数?
- 我正在声明一个自定义优先级队列,包括 pair<pair<int,int>int >,如何清除它?
- 在1语句中传递一个自定义函数作为模板参数
- 如何创建一个qmake函数来创建一个自定义的make目标
- 预处理一个自定义文本文件,以使用Boost Spirit删除注释
- 从Java到C++:如何在另一个自定义类中使用一个自定义类名var
- 是否可以编写一个自定义 STL 分配器,该分配器使用指向用户提供的分配函数的指针
- C++:为unordered_set编写一个自定义哈希函数,该函数使用哈希表中的桶数
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 为windows实现一个自定义的unistd.h来处理VisualStudio问题
- 需要一个自定义的丰富编辑控件(开源)
- 我可以为抛出bad_cast的情况安装一个自定义处理程序吗
- 如何在Qt/C++中构建一个自定义的本机OSX webkit小部件
- C++一个自定义的成员比较函数
- 创建一个自定义锁屏Windows7
- 为分布式系统构建了一个自定义的C++通信协议
- 如何定义一个自定义比较函数来按照一维数组排序对矩阵进行排序