Latest web development tutorials

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

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

ここでは、どのような()メソッドは、すべてのサブの例外クラスをオーバーロードされていることを条件とするパブリック例外クラスです。これは、生成された、この例外の原因を返します。