C ++の例外処理
例外は、手続き実行中に発生した問題です。C ++例外は、ゼロ動作により分割する試みとして、実行しているプログラムの特別な状況を指します。
例外は、プログラムの制御を転送する方法を提供します。:C ++の例外処理は、3つのキーワードが含ま試し、キャッチ、スローを。
- スロー: 問題が発生すると、プログラムが例外をスローします。これは、使用して行われる スロー 完了するために、キーワードを。
- キャッチ: あなたはこの問題に対処したい場合は、例外ハンドラで例外をキャッチします。キャッチ キーワードは、例外をキャッチするために使用されます。
- トライ: トライ ブロック識別コードは、特定の異常に活性化されます。これは、通常、1つのまたは複数のcatchブロックが続いています。
ブロックが例外をスローがある場合は、例外が使用する方法をキャプチャします 試してみる と キャッチ キーワードを。tryブロックコードは例外をスローすることが配置され、tryブロックコードは、保護コードと呼ばれます。try / catch文の構文を使用し、次のとおりです。
try
{
// 保护代码
}catch( ExceptionName e1 )
{
// catch 块
}catch( ExceptionName e2 )
{
// catch 块
}catch( ExceptionName eN )
{
// catch 块
}
場合 のtry ブロックは、異なるコンテキストで別の例外をスローし、この時点では、複数のリストしようとする キャッチ 例外の種類をキャッチするためのステートメントを。
例外を投げます
あなたは使用することができます スロー コードブロック内のどこにでも例外をスローするステートメントを。スロー文のオペランドは、式の結果のいずれかの表現型がスローされた例外の種類を判別することができます。
ゼロで除算試行されている以下の実施例は、例外をスローします。
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
例外をキャッチ
キャッチ ブロックが続く しようと 例外をキャッチするために、ブロックをバック。あなたはキャッチキーワードの後の括弧内に宣言した異常によって決定されますが、キャプチャしたい例外の種類を指定することができます。
試す{//保護コード}キャッチ(ExceptionName E){//例外処理コード} exceptionName
コード・キャプチャの上記タイプ ExceptionNameの 例外。あなたはtryブロックでスローされた例外のいずれかのタイプを扱うことができるブロックをキャッチしたい場合は、次のように、括弧例外宣言...省略記号内で使用する必要があります。
{//コードは、任意の例外を処理することができます} {//保護コード}キャッチ(...)をしてみてください
以下は例外の例は、ゼロによる除算をスローし、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 ::例外 | 例外は、すべての標準C ++の例外の親です。 |
std :: bad_alloc | 例外は、することができ 、新たな スロー。 |
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 ::文字列を作成するとき、それがスローされます。 |
std :: out_of_range | この方法は、例えば、スタンダード::ベクトルとstd ::ビットセット<> ::演算子[]()とすることができる例外をスローします。 |
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
ここでは、どのような()は、 それがすべてのサブの例外クラスをオーバーロードされている、例外クラスを提供する一般的な方法です。これは、生産の異常の原因を返します。