をスローすると、次のような落とし穴があります。boost :: shared_ptr <customException>
if (someCondition)
throw boost::shared_ptr<SomeException>(new SomeException("foo!"));
...
catch(const boost::shared_ptr<SomeException>& expRef)
{
}
をスローすると、次のような落とし穴があります。boost :: shared_ptr <customException>
if (someCondition)
throw boost::shared_ptr<SomeException>(new SomeException("foo!"));
...
catch(const boost::shared_ptr<SomeException>& expRef)
{
}
はい、落とし穴があります。あなたは、基底クラスに基づいてキャッチすることができません。
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
}
あなたは、もちろん、それはベースの上に投げる作ることができますが、その後、あなたが派生キャッチすることはできません。
だから...しないでください。
あなたはポインタによってスローされないよう、そしてthrowing by valueとcatching by (const) referenceを好む必要があります。
スマートポインタを使用すると、ポインタを使用する際のリソース管理が簡素化されますが、ポインタの使用を避けることができれば簡単になります。ちょうど値を投げる。
+1、これはCrazy Eddieと同じくらい良い答えです。私が彼を選んだ理由は、1)私があなたが2)あなたが言及したという事実を認識していた間、前に言ったことについて私は考えなかった。 – lurscher
私が見ることができる唯一の落とし穴は、あなたがしなければならないときに、あなたが何か苦労しているということです。 :-)
通常、オブジェクトの存続時間を管理するためにshared_pointerを使用します。それ以外の場合は明白ではありません。ここでは、投げられた例外を管理するのはの責任ではないことは明らかです。コンパイラはあなたのためにそれを行う必要があります!
例外が処理されると、実行時にshared_pointerが破棄され、例外オブジェクトが破棄されます。そうしないと、ランタイムは例外オブジェクトを直接破壊してしまいます。あなたは何を得ますか?
これは珍しいという事実を除けば、なぜあなたは 'shared_ptr'を投げたいのですか? –
あなたがコードを複雑にしていることに加えて、より簡単に書くことができ、パフォーマンスが向上するかもしれないもののパフォーマンスの低い構成(動的割り当て)を使用する...私は他の落とし穴を考えることはできません。 –
shared_ptrをスローすると、スライシングなしで、または例外クラスでクローンを実装しなくても、非同期境界を越えて例外を伝播できます。 –