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 以降では、noexcept 指定子が追加されました。
繰り返しますが、署名がスローするようにマークされている場合でも、呼び出し元が処理する必要はありません。
コンテキストに応じて、例外的な動作を型システムにコーディングすることで確実に処理できます。
ライブラリの基礎の一部としてのstd::optionalを参照してください。
呼び出し元の関数が try/catch を使用して、スローされた例外が常にキャッチされるようにする方法はありますか?
私自身を含むJava クラウドが、チェック済み例外を回避しようとしているのは、かなりおかしいと思います。彼らは、 RuntimeExceptionsを使用して強制的に例外をキャッチすることを回避しようとしています。
または、重大な例外をスローし始める可能性があります。確かに、アクセス違反の例外はユーザーの注意を引くでしょう。