3

我正在使用 Boostexception_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应该是 typeerror而不是 type clone_impl

我正在使用 Boost 1.49.0。

4

1 回答 1

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

于 2013-11-15T03:43:06.650 回答