工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++ 例外処理:Try、Catch、throw の例

C++ の例外処理とは?

C++ での例外処理は、実行時エラーなどの予期しない状況を処理する方法を提供します。そのため、予期しない状況が発生するたびに、プログラム制御はハンドラーと呼ばれる特別な関数に移されます。

例外をキャッチするには、コードの一部のセクションを例外検査の下に置きます。コードのセクションは、try-catch ブロック内に配置されます。

コードのそのセクション内で例外的な状況が発生すると、例外がスローされます。次に、例外ハンドラがプログラムの制御を引き継ぎます。

例外的な状況が発生しない場合、コードは正常に実行されます。ハンドラーは無視されます。

この C++ チュートリアルでは、次のことを学びます:

例外処理を行う理由

C++ で例外処理を使用する理由は次のとおりです。

例外処理キーワード

C++ での例外処理は、次の 3 つのキーワードを中心に展開されます。

コード ブロックで例外が発生するとします。例外は、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
}

例 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;
}

出力:

コードのスクリーンショットは次のとおりです:

コードの説明:

<オール>
  • iostream ヘッダー ファイルをプログラムにインクルードして、その関数を使用します。
  • ベクトル ヘッダー ファイルをプログラムにインクルードして、その関数を使用します。
  • プログラム内の std 名前空間を呼び出さずにそのクラスに含めます。
  • main() 関数を呼び出します。プログラム ロジックは、その本体内に追加する必要があります。
  • 整数データを格納する vec という名前のベクトルを作成します。
  • vec という名前のベクトルに要素 0 を追加します。
  • vec という名前のベクトルに要素 1 を追加します。
  • コメント。 C++ コンパイラによってスキップされます。
  • try ステートメントを使用して例外をキャッチします。 { は、try/catch ブロックの本体の開始を示します。ボディ内に追加されたコードは、保護されたコードになります。
  • vec という名前のベクトルのインデックス 2 (3 番目の要素) に格納されている要素へのアクセスを試みます。この要素は存在しません。
  • try/catch ブロックの本体の終わり。
  • 例外をキャッチします。返されたエラー メッセージは変数 ex に格納されます。
  • 例外がキャッチされた場合、コンソールにメッセージを出力します。
  • catch ブロックの本体の終わり。
  • プログラムは、実行が成功したときに値を返す必要があります。
  • main() 関数本体の終わり。
  • 例 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;
    }
    

    出力:

    コードのスクリーンショットは次のとおりです:

    コードの説明:

    <オール>
  • iostream ヘッダー ファイルをプログラムにインクルードして、その関数を使用します。
  • プログラム内の std 名前空間を呼び出さずにそのクラスに含めます。
  • 2 つの整数引数 x と y を取る zeroDivision という名前の関数を作成します。関数は double の結果を返す必要があります。
  • if ステートメントを使用して、可変引数 y の値が 0 かどうかを確認します。{ は、if 本体の開始を示します。
  • y が 0 の場合に返される/スローされるメッセージ。
  • if ステートメントの本文の終わり。
  • zeroDivision 関数は x/y の値を返す必要があります。
  • zeroDivision 関数の本体の終わり。
  • main() メソッドを呼び出します。 { は、このメソッドの開始を示します。
  • 整数変数を宣言し、それに値 11 を割り当てます。
  • 整数変数 b を宣言し、それに値 0 を割り当てます。
  • double 変数 c を宣言し、それに値 0 を割り当てます。
  • try ステートメントを使用して例外をキャッチします。 { は、try/catch ブロックの本体の開始を示します。ボディ内に追加されたコードは、保護されたコードになります。
  • zeroDivision 関数を呼び出し、引数 a と b、つまり 11 と 0 を渡します。この操作の結果は、変数 c に格納されます。
  • 変数 c の値をコンソールに出力します。
  • try/catch ブロックの本体の終わり。
  • 例外をキャッチします。返されたエラー メッセージは変数 message に格納されます。
  • 返されたエラー メッセージをコンソールに出力します。
  • catch ブロックの本体の終わり。
  • プログラムは、実行が成功したときに値を返す必要があります。
  • main() 関数本体の終わり。
  • C++ 標準例外

    C++ には、 クラスで定義された標準例外のリストが付属しています。これらについて以下に説明します:

    例外 説明 std::exceptionこれは例外であり、すべての標準 C++ 例外の親クラスです。std::bad_allocこの例外は、新しいキーワードによってスローされます。std::bad_castこれは、dynamic_cast によってスローされる例外です。std::bad_exception予期しない例外を処理するための便利なデバイスです。 C++ プログラムの std::bad_typeidtypeid によってスローされる例外。std::logic_errorこの例外は、理論的にはコードを読み取ることで検出可能です。std::domain_errorこれは、数学的に無効なドメインを使用した後にスローされる例外です。std::invalid_argument無効な引数を使用したためにスローされる例外です。 .std::length_error 大きな std::string を作成した後にスローされる例外.std::out_of_range at メソッドによってスローされる.std::runtime_errorこれは、コードを読み取ることによって検出できない例外です.std::overflow_errorこの例外は、発生後にスローされますstd::range_errorこの例外は、範囲外の値を格納しようとするとスローされます。std::underflow_error m の発生後にスローされる例外数学的なアンダーフロー。

    ユーザー定義の例外

    C++ std::exception クラスを使用すると、例外としてスローできるオブジェクトを定義できます。このクラスは ヘッダーで定義されています。このクラスは、what という名前の仮想メンバー関数を提供します。

    この関数は、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;	
    }
    

    出力:

    コードのスクリーンショットは次のとおりです:

    コードの説明:

    <オール>
  • プログラムに iostream ヘッダー ファイルをインクルードします。エラーが発生することなく、その機能を使用します。
  • プログラムに例外ヘッダー ファイルを含めます。その機能をエラーなしで使用します。
  • std 名前空間をプログラムに含めて、そのクラスを呼び出さずに使用できるようにします。
  • newException という名前の新しいクラスを作成します。このクラスは C++ の例外クラスを継承しています。
  • クラス本体の始まり。
  • 例外ヘッダー ファイルで定義されている仮想メンバー関数 what() を上書きします。次に、独自の例外である新しい例外について説明します。
  • 新しい例外の定義を開始します。
  • 新しい例外がキャッチされた場合に返されるメッセージ。
  • 新しい例外の定義の終わり。
  • クラス newException の本体の終わり。 newex は、新しい例外をキャッチするために使用される名前であり、その後で newException が呼び出されます。
  • main() 関数を呼び出します。プログラム ロジックは、その本体内に追加する必要があります。 { は、その本体の始まりを示します。
  • try ステートメントを使用して、例外をマークする必要があるコードをマークします。 { は、try/catch ブロックの本体の開始を示します。これで囲まれたコードが保護されます。
  • キャッチされた場合、newex 例外をスローします。
  • try 本体の終わり。
  • catch ステートメントを使用して例外をキャッチします。例外エラー メッセージは、変数 ex に格納されます。
  • 例外エラー メッセージをコンソールに出力します。
  • catch ステートメントの本文の終わり。
  • プログラムが正常に実行された場合、プログラムは値を返す必要があります。
  • main() 関数の本体の終わり。
  • まとめ:


    C言語

    1. C++ コメント
    2. try、except、finally ステートメントを使用した Python 例外処理
    3. Java 例外処理
    4. Java トライ...キャッチ
    5. C++ の演算子と例:型とプログラムとは
    6. C++ Switch Case ステートメントと EXAMPLE
    7. 例による配列の C++ 動的割り当て
    8. C++ 構造体と例
    9. C++ の std::list と例
    10. 構造体とクラスの違い:C++ の例で説明
    11. 15 の最高の C++ IDE:無料の Windows エディター |コンパイラ | 2021年