例外は、手続き実行中に発生した問題です。C ++ 異常は、プログラムが実行されたときに特殊な場合は、ゼロ動作により除算する試みとして、発生しています。 例外は、プログラムの制御を転送する方法を提供します。C:++の例外処理は、3つのキーワードが含ま試し、キャッチ、スローを。 スロー:問題が発生すると、プログラムが例外をスローします。これは、使用して行われるスロー完了するために、キーワードを。 キャッチ:あなたは、問題に対処したい、例外ハンドラで例外をキャッチします。キャッチキーワードは、例外をキャッチするために使用されます。 トライ:トライブロック識別コードは、特定の異常に活性化されます。これは、通常、1つまたは複数が続いているのcatchブロック。
ブロックが例外をスローがある場合は、例外が使用する方法をキャプチャします試してみるとキャッチキーワードを。トライ、例外コードをスローすることが置かれているブロックしようとブロックコードは、保護コードと呼ばれています。使用して試して / キャッチ、次のように文の構文は次のとおりです。 試してみます { // 保護コード } キャッチ(exceptionName E1) { // キャッチ块 } キャッチ(ExceptionName E2) { // キャッチ块 } キャッチ(ExceptionName JA) { // catchブロック } 場合のtryブロックは、異なるコンテキストで別の例外をスローし、この時点では、複数のリストしようとするキャッチ例外の種類をキャッチするためのステートメントを。
使用スローコードブロックにおける例外のどこをスローするステートメントを。スローオペランドは、文は式の結果のいずれかの表現型がスローされた例外の種類を判別することができます。 以下はゼロで割った試みの例では例外をスローします。 二重分割(int型、int型B) { もし(B == 0 ) { 投げる 「ゼロの状態によって部門を!」。 } リターン(/ B)。 }
キャッチブロックが続くトライキャッチ例外に、バックブロックを。あなたがキャプチャしたい例外の種類を指定することができ、これはキャッチキーワードの後のカッコ内の意思決定の例外宣言。 試します { // 保護コード } キャッチ(exceptionName E) { // 処理ExceptionName例外コード } 上記捕捉異常ExceptionNameのタイプのコード。あなたがしたい場合は、キャッチ扱うことができるブロックしようとスローされた例外ブロックのいずれかの種類を次のように、あなたは...括弧異常省略記号でステートメントを使用する必要があります 試して { // 保護コード } キャッチ(...) { // すべての例外コードを処理することができます }
書式#include <iostreamの> 使用して 名前空間はstdを、 二重分割(int型、int型B) { もし(B == 0 ) { 投げる 「ゼロの状態によって部門を!」。 } リターン(/ B)。 } int型のmain() { INT X = 50 。 int型 = Y 0 。 二重 Z = 0 。 してみてください{ Z = 分割(X、Y) COUT << Z << ENDL。 } キャッチ(CONST 文字 * MSG){ CERR << MSG << てendl; } リターン 0 ; } 彼はタイプスローのconst char型の例外をキャッチするときに、私たちがしなければならない、異常*をキャッチブロックの使用のconst char型 *。
C ++は、標準の例外のセットは、我々はプログラムでこれらの標準の例外を使用することができます。<例外>で定義されています。これらは、以下のように整理親子クラス階層に基づいています。
以下の表は、上記異常な階層現れるの各々の記述です。 std ::例外は、すべての標準Cの例外です ++ 異常な親。 std :: bad_allocによって例外新しいスロー。 std :: bad_cast例外はdynamic_castをによってスローすることができます。 std :: bad_exception Cで、このプロセス ++でプログラムが例外を期待することができないときに非常に便利です。 std ::例外をbad_typeidは、型IDによってスローすることができます。 std ::は理論的に可能logic_errorは、コードを読み取ることにより、異常を検出します。 std :: domain_error数学の無効なドメインを使用した場合と、それはスローされます。 ときはstd ::例外Invalid_argumentを無効なパラメータがスローされますとき。 std ::長すぎるの作成:: STD length_error 文字列の時間を、それが例外をスローします。 STD ::方法、例えば、スタンダード::ベクトルおよびビットセットによってスローout_of_range例外:: STD <> :: 演算子[]()。 std :: runtime_errorは、コードを読み取ることによって、異常を検出することは理論的に不可能です。 流出が数学に発生したときのstd :: overflow_error、それがスローされます。 範囲外の店舗値にしようとしたときにするときはstd :: range_error、それがスローされます。 ときはstd :: underflow_error数学アンダーフローが発生した場合、それがスローされます。
あなたは、継承とオーバーロード例外クラスを介して新しい例外を定義することができます。次の例では、独自の例外を実装するためのstd ::例外クラスを使用する方法を示します。 書式#include <iostreamの> の#include <例外> 使用して 名前空間はstdを、 構造体 MyException:公共の例外 { const のchar *何を()のconst スロー() { 戻る 「C ++の例外を」。 } }。 int型のmain() { 試します { スローMyExceptionを(); } キャッチ(MyException&E) { std :: coutの << " MyExceptionがキャッチ" << はstd ::てendl; std :: coutの << e.what()<< はstd ::てendl; } キャッチ(STD ::例外&E) { // その他のエラー } } ここでは、どのような()メソッドは、publicクラスが例外を提供し、それはすべてのサブ例外クラスをオーバーロードされています。これは異常生成の原因を返します。