C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で例外をスローする方法|throwとtry-catchの使い方を解説


例外処理(Exception Handling)は、プログラムの実行中に発生する予期しないエラーや異常な状態に対処するための仕組みです。C++では、try-catchブロックを使用してコードを保護し、問題が発生してもプログラムが異常終了しないように制御できます。

例外はコードブロック内の任意の場所からスローすることが可能で、その際に使用するのが「throw」キーワードです。throw文が実行されると、その時点で通常の処理は中断され、対応するcatchブロックへ制御が移ります。

C++におけるthrowの使用例

以下は、C++でthrowを使って例外をスローする具体例です。このプログラムでは、割り算の分母が0の場合に例外をスローし、それをcatchブロックで受け取ってエラーメッセージを表示します。

#include <iostream>
using namespace std;

// 割り算を行う関数。分母が0の場合は例外をスローする
int display(int x, int y) {
    if( y == 0 ) {
        throw "Division by zero condition!";
    }
    return (x/y);
}

int main () {
    int a = 50;
    int b = 0;
    int c = 0;

    try {
        c = display(a, b);
        cout << c << endl;
    } catch (const char* msg) {
        // スローされた例外を受け取り、エラーメッセージを出力
        cerr << msg << endl;
    }
    return 0;
}

実行結果

上記プログラムの実行結果は以下の通りです。

Division by zero condition!

コードの解説

このプログラムの流れを順番に見ていきましょう。

1. 関数内での例外スロー:display()関数では、引数yが0かどうかをチェックしています。yが0の場合、ゼロ除算は未定義動作となるため、文字列リテラル"Division by zero condition!"をthrowによってスローします。

2. tryブロックによる保護:main()関数内のtryブロックでは、display(a, b)の呼び出しが保護されています。ここではbが0であるため、関数内部から例外がスローされます。

3. catchブロックでの捕捉:スローされた例外は、const char*型の引数を持つcatchブロックで受け取られます。標準エラー出力(cerr)にメッセージが出力され、プログラムはクラッシュせずに正常に終了します。

なお、例外がスローされた時点で、変数cへの代入やcoutによる出力はスキップされます。このようにthrow・try・catchを組み合わせることで、エラーの発生箇所と処理箇所を分離した、読みやすく堅牢なコードを書くことができます。


  1. 【初心者向け】C++の例外処理の仕組みを徹底解説!try・catch・throwの基本から独自例外の作成まで

    C++における例外処理(Exception Handling)とは、プログラムの実行中に発生するエラー(ランタイムエラー)を適切に処理するための仕組みです。例外とは、実行時に送出されるイベントのことを指し、C++ではすべての標準例外が std::exception クラスを基底クラスとして定義されています。 もし例外を捕捉しなければ、プログラムは例外メッセージを出力した後に異常終了してしまいます。例外はハンドリング可能なランタイムエラーであり、適切に処理することでプログラムの堅牢性を大きく向上させることができます。 標準例外クラスの階層構造 C++標準では、例外は <exception&

  2. C++のnew演算子を使って2次元配列を動的に宣言・生成する方法

    動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。下図は、3×4の2次元配列のイメージです。アルゴリズムC++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。Begin 配列の寸法(行数・列数)を宣言する。 new を使って 2次元配列 a[][] を動的に確保する。 配列に要素を代入する。 配列の内容を出力する。 delete でメモリを解放する。 Endサンプルコ