例外について簡単な質問があります。人々が例外の種類ごとに別々のクラスを頻繁に使用するのはなぜですか?異なる例外を異なる方法で処理したい場合があるからですか? (たとえば、「...」をキャッチするだけと比較して)。
2 に答える
例外オブジェクトは、何かが発生したことを示すためだけのものではないためcatch (...)
、例外の力を使用するための非常に原始的な方法になります。
通常、各例外オブジェクトは、例外が発生した場所から処理される場所までの情報である「ペイロード」を運びます。例外がアンワインド コール スタックを飛び上がると、途中の関数が例外を傍受し、追加情報で強化し、さらに上に送信する可能性があります。プログラム内の異なる機能モジュールは、まったく異なる情報を例外ハンドラーに送信します。そのため、その情報を運ぶために異なる例外クラスが必要になります。
たとえば、パーサー例外は、行番号と構文エラーの性質に関する情報を運ぶ場合があります。ファイル システムの例外には、ファイル名とエラー コードに関する情報が含まれている場合があります。動的メモリ例外には、特定のメモリ操作とメモリ ブロック サイズに関する情報が含まれる場合があります。等々。これらの完全に無関係なデータ セットを格納して運ぶには、通常、さまざまな例外の種類を定義します。
例外的な場合に提供するデータが異なり、さまざまなエラーを処理する方法が異なるだけでなく、それらをさまざまな場所で処理することもできます。loadFileContentIntoMemory
ファイル システム エラー (アクセス権、ファイルが見つからないなど) およびメモリの問題 (通常は ) が原因でエラーをスローする関数を考えてみましょうstd::bad_alloc
。ある種類のエラーを処理したい一方で、同じ時点で別の種類のエラーを処理できない場合があります。たとえば、ファイル関連のエラーをキャッチして別のファイル名を試してみたいと思うかもしれませんが、通常bad_alloc
、プログラムのどの時点でも何かを行うのは難しいため、多くのプログラムは最上位の場所でそれをキャッチしてエラー メッセージを発行し、終了します。プログラム。