3

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>
}

etypeerrorではなく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の「Why is boost::exception abstract?」セクションを参照してください。

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 に答える