例外は、手続き実行中に発生した問題です。C ++例外は、ゼロ動作により分割する試みとして、実行しているプログラムの特別な状況を指します。
例外は、プログラムの制御を転送する方法を提供します。C ++の例外処理は、3つのキーワードを含む:投げる、キャッチ、試してみてください。
- スロー:問題が発生すると、プログラムが例外をスローします。これが完了するのスローキーワードを使用して行われます。
- キャッチ:あなたはこの問題に対処したい場合は、例外ハンドラで例外をキャッチします。キャッチキーワードは、例外をキャッチするために使用されます。
- 試す:ブロック識別コードが特定の異常を活性化することを試みます。これは、通常、1つのまたは複数のcatchブロックが続いています。
ブロックが例外をスローがある場合は、例外はtryおよびcatchキーワードをキャプチャする方法を使用します。tryブロックコードは例外をスローすることが配置され、tryブロックコードは、保護コードと呼ばれます。try / catch文の構文を使用し、次のとおりです。
トライ { // 保護コード } キャッチ(exceptionName E1) { // catchブロック } キャッチ(exceptionName E2) { // catchブロック } キャッチ(exceptionName EN) { // catchブロック }
tryブロックは、異なるコンテキストで別の例外をスローした場合、この時間は、例外の種類をキャッチするために複数のcatchステートメントを一覧表示しようとします。
例外を投げます
あなたは、コードブロック内のどこにでも例外をスローするthrowステートメントを使用することができます。スロー文のオペランドは、式の結果のいずれかの表現型がスローされた例外の種類を判別することができます。
ゼロで除算試行されている以下の実施例は、例外をスローします。
ダブル部門(int型、int型B) { 場合(Bの== 0 ) { スロー " ゼロの状態による除算を!" 。 } 戻り(A / B)。 }
例外をキャッチ
続くcatchブロックが例外をキャッチするために、ブロックを試してみてください。あなたはキャッチキーワードの後の括弧内に宣言した異常によって決定されますが、キャプチャしたい例外の種類を指定することができます。
試し { // 保護コード } キャッチ(exceptionName E) { // プロセスexceptionName例外コード }
上記捕捉異常ExceptionNameのタイプのコード。あなたはtryブロックでスローされた例外のいずれかのタイプを扱うことができるブロックをキャッチしたい場合は、次のように、括弧例外宣言...省略記号内で使用する必要があります。
試し { // 保護コード } キャッチ(...) { // 任意の例外コードを処理することができます }
以下は例外の例は、ゼロによる除算をスローし、catchブロックで例外を捕捉されています。
例
書式#include <iostreamの> 使用して 名前空間はstdを、 ダブル部門(int型、int型B) { 場合(Bの== 0 ) { スロー " ゼロの状態による除算を!" 。 } 戻り(A / B)。 } int型のmain() { int型のx = 50 。 int型、Y = 0 。 二重 Z = 0 。 試す{ Z = 分割(X、Y) COUT<< Z << ENDL。 } キャッチ(CONST のchar *のMSG){ CERR << MSG << ENDL。 } 戻り 0 。 }
我々はタイプのconstのchar *の例外をスローするので、例外をキャッチしたときに、それゆえ、我々は、catchブロックでのconstのchar *を使用する必要があります。上記のコードがコンパイルおよび実行されると、次の結果を生成します:
ゼロ条件による除算!
C ++標準の例外
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 :: 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。 :: COUT STD << e.what()<< STD :: ENDL; } キャッチ(例外&STD :: E) { // 他のエラー } }
これにより、以下の結果が得られます。
MyExceptionがキャッチ
C ++の例外を
ここでは、どのような()メソッドは、publicクラスが例外を提供し、それはすべてのサブの例外クラスをオーバーロードされています。これは、生産の異常の原因を返します。
オリジナルリンク:https://www.runoob.com/cplusplus/cpp-exceptions-handling.html