C++ 例外処理:Try、Catch、throw の例
C++ の例外処理とは?
C++ での例外処理は、実行時エラーなどの予期しない状況を処理する方法を提供します。そのため、予期しない状況が発生するたびに、プログラム制御はハンドラーと呼ばれる特別な関数に移されます。
例外をキャッチするには、コードの一部のセクションを例外検査の下に置きます。コードのセクションは、try-catch ブロック内に配置されます。
コードのそのセクション内で例外的な状況が発生すると、例外がスローされます。次に、例外ハンドラがプログラムの制御を引き継ぎます。
例外的な状況が発生しない場合、コードは正常に実行されます。ハンドラーは無視されます。
この C++ チュートリアルでは、次のことを学びます:
- C++ の例外処理とは?
- 例外処理を行う理由
- 例外処理キーワード
- 構文:
- C++ 標準例外
- ユーザー定義の例外
例外処理を行う理由
C++ で例外処理を使用する理由は次のとおりです。
- エラー処理コードを通常のコードから分離します。コードが読みやすくなり、保守が容易になります。
- 関数は、選択した例外を処理できます。関数が多くの例外をスローしたとしても、一部しか処理しません。キャッチされなかった例外は呼び出し元が処理します。
例外処理キーワード
C++ での例外処理は、次の 3 つのキーワードを中心に展開されます。
- 投げる – プログラムで問題が発生すると、例外がスローされます。 throw キーワードは、プログラムがスローを実行するのに役立ちます。
- キャッチ – プログラムは、例外ハンドラーを使用して例外をキャッチします。問題を処理する必要があるプログラムのセクションに追加されます。これは catch キーワードを使用して行われます。
- やってみる – try ブロックは、特定の例外がアクティブ化されるコード ブロックを識別します。その後に 1 つ以上の catch ブロックが続く必要があります。
コード ブロックで例外が発生するとします。例外は、try および catch キーワードを使用するメソッドによってキャッチされます。 try/catch ブロックは、例外をスローする可能性のあるコードを囲む必要があります。このようなコードは、保護されたコードとして知られています。
構文:
try/catch は次の構文を取ります:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
- try ステートメントは 1 つですが、多くの catch ステートメントを使用できます。
- ExceptionName は、キャッチされる例外の名前です。
- exception1、exception2、および exceptionN は、例外を参照するために定義した名前です。
例 1:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); // access the third element, which doesn't exist try { vec.at(2); } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>例 2:
#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return (x / y); } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>C++ 標準例外
C++ には、
ユーザー定義の例外
C++ std::exception クラスを使用すると、例外としてスローできるオブジェクトを定義できます。このクラスは
この関数は、char * 型のヌル終了文字シーケンスを返します。派生クラスで上書きして、例外の説明を付けることができます。
例:
#include <iostream> #include <exception> using namespace std; class newException : public exception { virtual const char* what() const throw() { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << '\n'; } return 0; }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>まとめ:
- C++ の例外処理を使用すると、実行時エラーを処理できます。
- 実行時エラーは、プログラムの実行中に発生するエラーです。
- 例外処理は、プログラム内の予期しない状況を処理するのに役立ちます。
- 予期しない状況が発生すると、プログラムの制御がハンドラに移ります。
- 例外をキャッチするには、try-catch ブロックの下にコードのセクションを配置します。
- throw キーワードは、プログラムが例外をスローするのに役立ち、プログラムが問題を処理するのに役立ちます。
- try キーワードは、特定の例外がアクティブになるコード ブロックを識別するのに役立ちます。
- 例外ヘッダー ファイルの what() 関数を上書きして、例外を定義できます。
C言語