如果dynamic_cast<SomeType&>
失败,则会抛出bad_cast
异常。在我的代码中有一个单独的异常层次结构,而bad_cast
不在该层次结构中,因此我的代码将不会处理bad_cast
。我可能会抛出其他一些例外吗?
我的意思是我想编写一个这样的自定义处理程序:
void OnBadCast()
{
throw MyException( "Bad cast" );
}
以某种方式在C ++运行库中注册它
RegisterMyBadCastHandler( &OnBadCast );
以便调用此处理程序而不是抛出bad_cast
。
这可能吗?
答案 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;
}