Boost rethrow_exception抛出不同类型的异常

时间:2013-11-14 17:45:54

标签: c++ exception boost

我正在使用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。

1 个答案:

答案 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的现有对象的指针。