質問
C++ の例外は、呼び出し元の関数によってキャッチされる必要はありません (コンパイル時エラーは発生しません)。したがって、(Java とは異なり) try/catch を使用してそれらをキャッチするかどうかは開発者の判断に任されています。
スローされた例外が、呼び出し元の関数によって try/catch を使用して常にキャッチされるようにする方法はありますか?
解決
いいえ。
見る 例外仕様の実践的な考察 そうしない理由があります。
これを「助ける」唯一の方法は、関数がスローできる例外を、それを宣言するヘッダー ファイルのコメントとして文書化することです。これはコンパイラなどによって強制されるものではありません。そのためにはコードレビューを使用してください。
他のヒント
ここでは例外を使用すべきではありません。この関数を使用するすべての場所でそれを予期する必要がある場合、これは明らかに例外的なケースではありません。
より良い解決策は、このようなもののインスタンスを返す関数を取得することです。デバッグ ビルド (開発者が作成したばかりのコード パスを実行すると仮定) では、操作が成功したかどうかの確認を忘れた場合、アサートが返されます。
class SearchResult
{
private:
ResultType result_;
bool succeeded_;
bool succeessChecked_;
public:
SearchResult(Result& result, bool succeeded)
: result_(result)
, succeeded_(succeeded)
, successChecked_(false)
{
}
~SearchResult()
{
ASSERT(successChecked_);
}
ResultType& Result() { return result_; }
bool Succeeded() { successChecked_ = true; return succeeded_; }
}
あなたの質問の範囲外なので、これを投稿しないことについて議論しましたが、Javaには実際にはチェック済みとチェックなしの2種類の例外があります。基本的な違いは、次のとおりです。 c[++]
, 、チェックされていない例外をキャッチする必要はありません。
良い参考のために これを試して
クリスおそらく、この質問に対する純粋な答えはおそらく次のとおりです。
しかし、私は質問の根本に興味があります。ユーザーがすべき場合 いつも 呼び出しを try/catch ブロックでラップします。そもそも、ユーザーが呼び出した関数は本当に例外をスローする必要がありますか?
これは、問題のコードベースに関する詳細なコンテキストがなければ答えるのが難しい質問です。腰から言えば、ここでの最良の答えは、推奨される(コード全体の例外スタイルに応じてではないにしても)パブリックインターフェイスがtry/catchを実行するように関数をラップすることだと思います のために ユーザー。コード内に未処理の例外がないことを確認したいだけの場合は、単体テストとコード レビューがおそらく最良の解決策です。
かつて追加しようとしたことがありました 動的例外仕様 関数のシグネチャに適用されましたが、言語ではその正確性を強制できなかったため、後に減価償却されました。
C++11 以降では、 noexc 指定子.
繰り返しますが、署名がスローするようにマークされている場合でも、呼び出し元が署名を処理する必要はありません。
コンテキストに応じて、例外的な動作を型システムにコーディングすることで確実に処理できます。
見る: std::オプション ライブラリの基本の一部として。
あるいは、重大な例外をスローし始める可能性があります。確かに、アクセス違反例外は、 キャッチ ユーザーの注目を集めます。