web-dev-qa-db-ja.com

なぜconstへの参照として例外をキャッチするのですか?

私は何度も聞いて読んだことがあり、それは参照としてではなく参照から定数として例外をキャッチする方が良いです。なぜですか

try {
    // stuff
} catch (const std::exception& e) {
    // stuff
}

より良い

try {
    // stuff
} catch (std::exception& e) {
    // stuff
}
77
cairol

必要なもの:

  • 参照を使用して、例外に多態的にアクセスできます
  • パフォーマンスを向上させるconst、およびオブジェクトを変更しないことをコンパイラーに指示する

後者は同じくらい前者ほど重要ではありませんが、constを削除する唯一の本当の理由は、例外を変更することを通知することです(通常、再スローする場合にのみ役立ちます)上位レベルにコンテキストを追加しました)。

56

基本的に理由は全くありません。

例外オブジェクトは独自のメモリ空間にあります したがって、一時式で作成された例外をキャッチすることについて心配する必要はありません。

あなたがしているすべてはあなたが例外オブジェクトを変更しないことを約束していますが、例外オブジェクトは不変のインターフェースを持つべきなので、ここでは実際には何も実用的ではありません。

しかし、それを読んだときに暖かく居心地の良い気分になるかもしれません。それが私にとってはそうです!

 独自の特別なスレッドローカルスタックがあります。
 免責事項: Boost.Exceptionは、ファンキーなことをしたり、例外の詳細を追加したりするために、これを解除します。しかし、これはハッカーです!

コードを最適化するのに役立つ可能性がある例外を変更する関数を呼び出さないことをコンパイラに通知します。おそらく大きな違いはありませんが、それを行うためのコストも非常に小さいです。

5
Warpin

例外を変更しますか?そうでない場合は、constの場合もあります。同じ理由で、他の場所でconstを使用する必要があります(表面上はそれほど大きな違いがなく、コンパイラに役立つ可能性があり、プログラマがコードを適切に使用し、本来はすべきでないことを実行できないため、SHOULDと言います)

例外ハンドラーは、プラットフォーム固有である可能性があり、例外を変更することを期待していないため、面白い場所に例外を配置する可能性がありますか?

1
matt