工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++ 例外処理

例外は、プログラムの実行中に発生する問題です。 C++ 例外は、ゼロ除算など、プログラムの実行中に発生する例外的な状況への応答です。

例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。 C++ の例外処理は、try、catch、 の 3 つのキーワードに基づいて構築されています。 そして投げる .

ブロックが例外を発生させると仮定すると、メソッドは 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言語

  1. C++ 演算子
  2. C++ コメント
  3. C++ クラス テンプレート
  4. Cファイルの取り扱い
  5. Java 例外処理
  6. C++ 例外処理:Try、Catch、throw の例
  7. Python の例外処理:try、catch、finally、raise [例]
  8. C - エラー処理
  9. C++ の概要
  10. C++ 定数/リテラル
  11. C++ の演算子