次の落とし穴はありますか。
if (someCondition)
throw boost::shared_ptr<SomeException>( new SomeException( "foo!" ) );
...
catch( const boost::shared_ptr<SomeException>& expRef )
{
}
次の落とし穴はありますか。
if (someCondition)
throw boost::shared_ptr<SomeException>( new SomeException( "foo!" ) );
...
catch( const boost::shared_ptr<SomeException>& expRef )
{
}
ポインタによるスローは避け、値によるスローと(const)参照によるキャッチを優先する必要があります。
スマートポインターを使用することは、ポインターを使用する際のリソース管理を簡素化する方法ですが、ポインターの使用を完全に回避できる場合は、そうする方が簡単です。値を投げるだけです。
はい、落とし穴があります。基本クラスに基づいてキャッチすることはできません:
void f()
{
throw std::runtime_error("look here");
}
void g()
{
throw boost::shared_ptr<std::runtime_error>("look here");
}
int main()
{
try
{
f();
}
catch ( std::exception const& e) {}
try { g(); }
catch ( boost::shared_ptr<std::exception> const& e) {} // no work
}
もちろん、ベースにスローさせることはできますが、派生したものをキャッチすることはできません。
そうそう...それをしないでください。
私が見ることができる唯一の落とし穴は、あなたがする必要がないときに、あなたが難しい方法で何かをしているということです。:-)
通常、shared_pointerを使用してオブジェクトの存続期間を管理しますが、それ以外の場合は明らかではありません。ここで、スローされた例外を管理するのはあなたの責任ではないことは明らかです。コンパイラはあなたのためにそれをしなければならないでしょう!
例外が処理されると、ランタイムはshared_pointerを破棄し、それが例外オブジェクトを破棄します。そうしないと、ランタイムが例外オブジェクトを直接破棄してしまいます。何が得られますか?