Cの例外処理

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq_24624539/article/details/90597979

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 ++は、標準の例外のセットがで定義されてい  <例外>  、我々はプログラムでこれらの標準の例外を使用することができます。これらは、以下のように整理親子クラス階層に基づいています。

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

ここでは、どのような()は、  それがすべてのサブの例外クラスをオーバーロードされている、例外クラスを提供する一般的な方法です。これは、生産の異常の原因を返します。

おすすめ

転載: blog.csdn.net/qq_24624539/article/details/90597979