例外を参照としてではなく、constへの参照としてキャッチする方がよいと何度も聞いたり読んだりしました。理由:
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
より良い:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
回答:
必要なもの:
後者は前者ほど重要ではありませんが、constを削除する唯一の本当の理由は、例外を変更することを通知することです(通常、コンテキストを追加してより高いレベルに再スローする場合にのみ役立ちます)。 。
std::exception
のwhat()
関数など)を呼び出せることを意味します。値でキャッチした場合、その関数を呼び出して元の例外の詳細を取得することはできません。
基本的に理由は全くありません。
例外オブジェクトは独自のメモリ空間に存在する†ため、一時式で作成された例外をキャッチすることを心配する必要はありません。
あなたがしているのは、例外オブジェクトを変更しないことを約束することだけですが、例外オブジェクトは不変のインターフェースを持つ必要があるため‡、ここでは実際には何も実用的ではありません。
しかし、それを読むと、暖かく居心地の良い気分になるかもしれません—それが私にとっての方法です!
†独自の特別なスレッドローカルスタックがあります。
‡ 免責事項: Boost.Exceptionは、ファンキーな処理を実行し、構築後に例外の詳細を追加するために、これを中断します。しかし、これはハッカーです!
Exception objects live in their own memory space
ますか?あなたはそれについて提案するために良い読み物を持っていますか?
同じ理由で、constを使用します。