提升rethrow_exception引发不同类型的异常

Boost rethrow_exception throws exception of different type

本文关键字:同类型 异常 rethrow exception 提升      更新时间:2023-10-16

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

这是设计使然。

请参阅 http://www.boost.org/doc/libs/1_55_0/libs/exception/doc/frequently_asked_questions.html"为什么 boost::异常抽象?

boost::exception 的类型是抽象的,以防止用户"重新抛出"它。如果用户想要重新抛出,她被迫使用类似的代码

catch( boost::exception & e )
{
    e << foo_info(foo);
    throw; //Okay, re-throwing the original exception object.
}

你也可以从不同的角度看待这个问题。客户错误类型几乎可以是任何东西,它可能不允许从中派生,或者可能是不可复制或根本不可构造的(例如,只有朋友才能访问的私人构造函数)。因此,Boost 不能假设任何关于客户类型的信息,不能从中复制或派生/复制,只能保留指向传递给boost::copy_exception的现有对象的指针。