C++ 例外処理
例外は、プログラムの実行中に発生する問題です。 C++ 例外は、ゼロ除算など、プログラムの実行中に発生する例外的な状況への応答です。
例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。 C++ の例外処理は、try、catch、 の 3 つのキーワードに基づいて構築されています。 そして投げる .
- <リ>
投げる − 問題が発生すると、プログラムは例外をスローします。これはスローを使用して行われます キーワード。
<リ>キャッチ − プログラムは、問題を処理したいプログラム内の場所で、例外ハンドラーを使用して例外をキャッチします。 キャッチ キーワードは、例外のキャッチを示します。
<リ>試す − お試し block は、特定の例外がアクティブ化されるコードのブロックを識別します。その後に 1 つ以上の catch ブロックが続きます。
ブロックが例外を発生させると仮定すると、メソッドは try の組み合わせを使用して例外をキャッチします そしてキャッチ キーワード。例外を生成する可能性のあるコードの周りに try/catch ブロックが配置されます。 try/catch ブロック内のコードは保護されたコードと呼ばれ、try/catch を使用するための構文は次のとおりです −
try {
// protected code
} catch( ExceptionName e1 ) {
// catch block
} catch( ExceptionName e2 ) {
// catch block
} catch( ExceptionName eN ) {
// catch block
}
複数の catch をリストできます try の場合に備えて、さまざまな種類の例外をキャッチするステートメント ブロックは、さまざまな状況で複数の例外を発生させます。
例外のスロー
throw を使用して、コード ブロック内の任意の場所で例外をスローできます 声明。 throw ステートメントのオペランドは例外の型を決定し、任意の式にすることができ、式の結果の型はスローされる例外の型を決定します。
以下は、ゼロ除算条件が発生したときに例外をスローする例です-
double division(int a, int b) {
if( b == 0 ) {
throw "Division by zero condition!";
}
return (a/b);
}
例外のキャッチ
キャッチ try に続くブロック ブロックは例外をキャッチします。キャッチする例外のタイプを指定できます。これは、キーワード catch に続く括弧内に表示される例外宣言によって決定されます。
try {
// protected code
} catch( ExceptionName e ) {
// code to handle ExceptionName exception
}
上記のコードは ExceptionName の例外をキャッチします タイプ。 catch ブロックが try ブロックでスローされる任意のタイプの例外を処理する必要があることを指定する場合は、次のように、例外宣言を囲む括弧の間に省略記号 ... を配置する必要があります-
try {
// protected code
} catch(...) {
// code to handle any exception
}
以下は、ゼロ除算の例外をスローする例であり、catch ブロックでキャッチします。
ライブデモ
#include <iostream>
using namespace std;
double division(int a, int b) {
if( b == 0 ) {
throw "Division by zero condition!";
}
return (a/b);
}
int main () {
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
} catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
const char* 型の例外を発生させているため 、したがって、この例外をキャッチしている間、catch ブロックで const char* を使用する必要があります。上記のコードをコンパイルして実行すると、次の結果が生成されます −
Division by zero condition!
C++ 標準例外
C++ は、
上記の階層で言及されている各例外の簡単な説明を次に示します-
| Sr.No | 例外と説明 |
|---|---|
| 1 | std::例外 すべての標準 C++ 例外の例外および親クラス。 |
| 2 | std::bad_alloc これは new によってスローされる可能性があります . |
| 3 | std::bad_cast これは dynamic_cast でスローできます . |
| 4 | std::bad_exception これは、C++ プログラムで予期しない例外を処理するのに便利なデバイスです。 |
| 5 | std::bad_typeid これは typeid によってスローされる可能性があります . |
| 6 | std::logic_error コードを読み取ることで理論的に検出できる例外。 |
| 7 | std::domain_error これは、数学的に無効なドメインが使用された場合にスローされる例外です。 |
| 8 | std::invalid_argument これは、無効な引数が原因でスローされます。 |
| 9 | std::length_error これは、作成された std::string が大きすぎる場合にスローされます。 |
| 10 | std::out_of_range これは、std::vector や std::bitset<>::operator[]() などの 'at' メソッドによってスローされる可能性があります。 |
| 11 | std::runtime_error コードを読み取っても理論的には検出できない例外。 |
| 12 | std::overflow_error これは、数学的なオーバーフローが発生した場合にスローされます。 |
| 13 | std::range_error これは、範囲外の値を保存しようとしたときに発生します。 |
| 14 | std::underflow_error これは、数学的なアンダーフローが発生した場合にスローされます。 |
新しい例外を定義する
exception を継承してオーバーライドすることで、独自の例外を定義できます クラス機能。以下は、 std::exception クラスを使用して標準的な方法で独自の例外を実装する方法を示す例です-
ライブデモ
#include <iostream>
#include <exception>
using namespace std;
struct MyException : public exception {
const char * what () const throw () {
return "C++ Exception";
}
};
int main() {
try {
throw MyException();
} catch(MyException& e) {
std::cout << "MyException caught" << std::endl;
std::cout << e.what() << std::endl;
} catch(std::exception& e) {
//Other errors
}
}
これにより、次の結果が生成されます-
MyException caught C++ Exception
ここで、what() 例外クラスによって提供される public メソッドであり、すべての子例外クラスによってオーバーライドされています。これは例外の原因を返します。
C言語