動的例外仕様はC++17では無効ですか?このように
void f() throw(int);
ベストアンサー1
一般的なC++ガイドラインでは例外仕様の使用は推奨されていないC++ のどのバージョンでも、新しい標準ではこの機能は削除されています。
E.30: 例外仕様を使用しない
理由
例外仕様はエラー処理を脆弱にし、実行時のコストを課し、C++標準から削除されました。
例
int use(int arg) throw(X, Y) { // ... auto x = f(arg); // ... }
が
f()
とは異なる例外をスローしX
、Y
予期しないハンドラが呼び出され、デフォルトでは終了します。これは問題ありませんが、これが発生しないことを確認して をf
新しい例外 をスローするように変更した場合、変更(およびすべてを再テスト)Z
しない限りクラッシュが発生します。問題は、 が制御できないライブラリ内にある可能性があり、新しい例外は対処できないか、まったく関心がないことです。 をを 通過 するように変更できますが、の呼び出し元を変更する必要がある可能性があります。これはすぐに管理できなくなります。または、 に-を追加して、許容可能な例外にマップすることもできます。これもすぐに管理できなくなります。例外セットの変更は、多くの場合、システムの最下位レベルで発生することに注意してください (たとえば、ネットワーク ライブラリまたはミドルウェアの変更のため)。そのため、変更は長い呼び出しチェーンを通じて「バブルアップ」します。大規模なコード ベースでは、最後のユーザーが変更されるまで、誰もライブラリの新しいバージョンに更新できない可能性があります。ライブラリの一部である場合、変更が不明なクライアントに影響する可能性があるため、更新できない可能性があります。use()
f()
use()
use()
Z
use()
try
catch
use()
Z
use()
例外を、それを処理できる可能性のある関数に到達するまで伝播させるというポリシーは、長年にわたってその有効性が実証されてきました。
注記
いいえ。例外仕様が静的に強制されていたとしても、これは改善されません。例えば、ストロウストルプ94。
注記
例外が発生しない場合は、
noexcept
またはそれと同等のものthrow()
。