HOWTO · C++

C++ でのカスタム例外

C++ でのカスタム例外クラスの実装に関するプログラミングチュートリアル。

この簡単なプログラミングチュートリアルでは、C++ でカスタム例外クラスを実装する方法と、C++ でユーザー定義の例外クラスを実装するための基本的なルールについて説明します。

C++ での例外処理

C++ では、例外処理は実行時の問題を処理する方法です。例外を処理するため、実行時の問題が発生した場合でも、アプリケーションの通常のフローが維持されます。

C++ では、例外は実行時プロセス中にスローされるオブジェクトであり、プログラムの通常の実行を妨害します。

std::exception クラスは、すべての例外のルートです。例外を処理しない場合、アプリケーションはエラーメッセージを出力して終了します。

例外により、あるプログラム領域から別のプログラム領域に制御を渡すことができます。3つのキーワード trycatch、および throw は、C++ の例外を処理します。

  1. throw-コード内のセグメントが問題を引き起こす可能性がある場合は、throw キーワードを使用して例外をスローし、発生する可能性のある例外のタイプを指定します。
  2. try-エラーを引き起こす可能性があり、例外をスローする必要があるコードセグメントが含まれています。
  3. catch-例外がスローされたときに呼び出されるブロック。このコードブロックでは、エラーについてユーザーに通知し、必要に応じてプログラムでプログラムを終了できます。

例外の一般的な例の 1つは、実行時に発生するゼロ除算エラーです。これは、プログラムで最も頻繁に発生する例外です。

次のコードスニペットを見てみましょう。これは、このゼロ除算ランタイム例外が発生しやすいものです。

#include <iostream>
using namespace std;
float divideFunc(int a, int b) {
  if (b == 0) {
    throw "User made a division with zero!";
  }
  return (a / b);
}
int main() {
  int num1 = 20;
  int num2 = 0;
  float result = 0;
  try {
    result = divideFunc(num1, num2);
    cout << result << endl;
  } catch (const char* msg) {
    cout << msg << endl;
  }
}

出力:

ゼロ除算実行時例外

例外クラス階層

例外は、サブクラスとして多くのクラスを持つクラスであり、これらのクラスはすべて例外のタイプです。C++ には、プログラムですぐに使用できるように、事前定義された一般的な例外タイプのセットがあります。

例外クラス階層

C++ でのカスタム例外

C++ で指定されていないカスタム例外は、特定の状況下で生成するのに役立つ場合があります。C++ では、特定の条件を満たすすべての型をキャッチまたはスローできます。

これらには、有効なコピーコンストラクタとデストラクタを持つタイプが含まれます。

カスタム例外は、問題に関する有用な情報を備えた例外処理メカニズムを提供します。これらは、必要なプロパティを使用して新しいクラスを作成し、そのクラスのインスタンスをスローするか、std::exception から継承して what() 関数をオーバーライドすることで作成できます。

プログラムに正の数を入力する必要があるとします。負の数を入力すると、例外をスローできます。

次のようにカスタム例外クラスを作成できます。

class MyExceptionClass : public exception {
 public:
  const char* what() const throw() { return "Negative number not allowed\n"; }
};

これは、次のようにドライバプログラムでキャッチできます。

int main() {
  try {
    int a;
    cout << "Enter a number : \n";
    cin >> a;
    if (a < 0) {
      MyExceptionClass c;
      throw c;
    } else {
      cout << "you entered: " << a << endl;
    }
  } catch (exception& e) {
    cout << e.what();
  }
}

出力:

例外出力

上記のコードで、カスタム例外クラスを Exception クラスで継承し、例外がスローされたときに呼び出されるメソッド what() をオーバーライドしていることがわかります。