このトピックはSOで広く議論されていますが、次の事実を考慮して、まだはっきりしていないいくつかのことを明らかにしたいと思います。
10年前、ハーブサッターはこの機能の使用を控えるように言っていました。
関数/メソッドがスローする可能性のある例外を指定しても、関数の本体を変更して新しいタイプの例外をスローすることを決定したときに、コンパイラが強制的に怒鳴ることはなく、関数の宣言で例外仕様を変更することを誤って忘れてしまいます。
他のいくつかの高レベル関数を呼び出す非常に高レベルの関数があり、それぞれが大量のコードを実行して結果を生成する場合、最初の関数であるすべてのエラーを指定する必要があるときに、地獄の悪夢からのメンテナンスを想像できますがスローされる可能性があり、このリストには、内部関数がスローする可能性のあるすべての例外などが含まれている必要があるため、高レベル関数と低レベル関数の間に緊密な結合が作成されます。これは非常に望ましくありません。一方、すべての例外はstd :: runtime_errorから派生します。これは、適切な方法であることがわかっています。そして、高レベルの関数がstd :: runtime_errorをスローし、それで実行されるように指定できます。しかし、ちょっと待ってください...実際に例外をどこでキャッチしますか?高レベル関数がstd::runtime_errorのみをスローすることになっている場合、MyVerySpecific例外をキャッチするtry / catchブロックでこれらの高レベル関数の1つへの呼び出しを囲むことは、かなり奇妙/厄介/悪いことではないでしょうか? ?下位レベルの関数で特定の例外をキャッチするのは良いことでしょうか。例外は、それらについては何もできませんが、より多くの情報が追加された、より一般的なコンテナーに渡されます。私は確かに、例外をフォーマットするためだけに、私が書くすべての関数にtry/catchブロックを書きたくありません。それは、すべての関数にそのパラメーターを検証することを要求するようなものであり、それは人々を狂気に駆り立てることができます、
質問:
例外仕様に関するハーブサッターの怒りは今日でも続いていますか?それ以来、何か変わったことはありますか?私は主にC++0x以前の標準に興味があります。はいの場合、このトピックは終了したと見なすことができると思います。
コンパイラはこれらの例外仕様をほとんど無視しているようで、例外をキャッチする場合、99%の場合、を使用
catch (const CustomException &ex)
します。関数がCustomExceptionをスローするように指定するにはどうすればよいでしょうか。throw(CustomExecption)
またはthrow (CustomException &)
またはthrow (const CustomException &)
?私はすべてのバリエーションを見てきました、そして私は最初のものに行きますが、他のものは何か意味がありますか/何か利点を追加しますか?この機能を実際にどのように使用し、同時に、上記の3番目の事実に示されている誤謬を回避するのでしょうか。
編集:ライブラリを構築していると仮定します。例外仕様を使用しない場合、ユーザーはどのような例外が予想されるかをどのように知ることができますか?彼らは確かに、APIメソッドによって内部的に呼び出される関数を確認しません...