C ++の例外処理
例外は、実行中に発生する手続き上の問題です。 C ++の例外は、プログラムが実行されているときに、このようなゼロ操作によって分割する試みとして、起こる特別なことをいいます。
例外は、転送プログラム制御方法が提供されます。 C ++の例外処理は、3つのキーワードを含む:投げ、キャッチ、試してみてください。
- スロー:問題が発生した場合、プログラムは例外をスローします。これが完了するためにスローキーワードを使用して行われます。
- キャッチ:あなたは、問題に対処したい場合には、例外は例外ハンドラによってキャッチされます。キャッチキーワードは、例外をキャッチするために使用されます。
- 試してみてください。ブロック・コードは、特定の例外が活性化された識別してみてください。 それは通常、1つまたは複数のcatchブロックが続いているの背後にあります。
ブロックがある場合は例外をスローし、例外方法は、キーワードを試してみて 、キャッチ使用していますキャッチ。ブロックコードは、コード保護として知られてみてください、例外をスローする可能性のあるコードのブロックを配置してみてください。 try / catchステートメントの構文を使用し、次のとおりです。
try { // 保护代码 }catch( ExceptionName e1 ) { // catch 块 }catch( ExceptionName e2 ) { // catch 块 }catch( ExceptionName eN ) { // catch 块 }
あなたが別の例外がスローされます異なるコンテキストでブロックをしようとすると 、この時間は、あなたは、例外の種類をキャッチするために複数のcatchステートメントを一覧表示しようとすることができます。
例外をスロー
コードブロックは例外をスローであなたはどこにでもthrowステートメントを使用することができます。 オペランドthrow文は、式の結果のいずれかの式の型がスローされた例外のタイプを決定することができます。
以下は例で割っゼロを試してみては例外です。
double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); }
例外をキャッチ
tryブロックの後ろのcatchブロックは、例外を捕捉します。あなたがキャッチキーワードの決定の後の括弧内に例外によって宣言されているキャプチャする例外の型を指定することができます。
try { // 保护代码 }catch( ExceptionName e ) { // 处理 ExceptionName 异常的代码 }
上記のコードは、タイプExceptionName例外をキャプチャします。 あなたは例外スローtryブロックの任意の型を扱うことができるブロックをキャッチしたい場合は、次のように、括弧省略記号...文の中で例外を使用する必要があります。
try { // 保护代码 }catch(...) { // 能处理任何异常的代码 }
ここでゼロ除算の例は、例外をスローされ、例外が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 ++は<例外>で定義された標準の例外のセットを提供し、我々はプログラムでこれらの標準の例外を使用することができます。 これらは、以下のように整理親子クラス階層に基づいています。
次の表は、上記の階層の各異常が現れについての説明です。
异常 | 描述 |
---|---|
std::exception | 该异常是所有标准 C++ 异常的父类。 |
std::bad_alloc | 该异常可以通过new抛出。 |
std::bad_cast | 该异常可以通过dynamic_cast抛出。 |
std::bad_exception | 这在处理 C++ 程序中无法预期的异常时非常有用。 |
std::bad_typeid | 该异常可以通过typeid抛出。 |
std::logic_error | 理论上可以通过读取代码来检测到的异常。 |
std::domain_error | 当使用了一个无效的数学域时,会抛出该异常。 |
std::invalid_argument | 当使用了无效的参数时,会抛出该异常。 |
std::length_error | 当创建了太长的 std::string 时,会抛出该异常。 |
std::out_of_range | 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。 |
std::runtime_error | 理论上不可以通过读取代码来检测到的异常。 |
std::overflow_error | 当发生数学上溢时,会抛出该异常。 |
std::range_error | 当尝试存储超出范围的值时,会抛出该异常。 |
std::underflow_error | 当发生数学下溢时,会抛出该异常。 |
新しい例外を定義します
あなたは例外クラスの継承やオーバーロードして、新しい例外を定義することができます。 次の例は、独自の例外を実装するためのstd ::例外クラスを使用する方法を示します。
#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) { //其他的错误 } }
これにより、以下の結果が得られます。
MyException caught C++ Exception
ここでは、どのような()メソッドは、すべてのサブの例外クラスをオーバーロードされていることを条件とするパブリック例外クラスです。これは、生成された、この例外の原因を返します。