我正在使用Boost exception_ptr
并观察rethrow_exception(ptr)
没有给我原始异常。我把它煮熟了:
struct error : virtual std::exception, virtual boost::exception {};
try {
boost::exception_ptr ptr(boost::copy_exception(error()));
boost::rethrow_exception(ptr);
}
catch(boost::exception& e) {
// e is a boost::exception_detail::clone_impl<error>
}
e
不应该是error
类型而不是clone_impl
类型吗?
我正在使用Boost 1.49.0。
答案 0 :(得分:2)
这是设计的。
参见http://www.boost.org/doc/libs/1_55_0/libs/exception/doc/frequently_asked_questions.html,“为什么是boost :: exception摘要?”
boost :: exception的类型是抽象的,以防止用户“重新抛出”它。如果用户想要重新抛出,她将被迫使用像
这样的代码catch( boost::exception & e )
{
e << foo_info(foo);
throw; //Okay, re-throwing the original exception object.
}
您也可以从不同的角度来看待这一点。客户错误类型几乎可以是任何类型,它可能不允许从中派生,或者可能根本不可复制或不可构造(例如,只有朋友可访问的私有构造函数)。因此,Boost不能假设有关客户类型的任何内容,无法复制或从中复制或复制,只能保留指向传递给boost::copy_exception
的现有对象的指针。