C++ 例外処理メソッド

angryTom
リリース: 2019-10-23 16:53:25
オリジナル
4869 人が閲覧しました

C++ 例外処理メソッド

#c 例外処理

プログラムの実行中に、次のような異常な状況に遭遇することがよくあります。除算を行うと 0 になります。年齢を入力するときにユーザーが負の数値を入力しました。new 演算子を使用して動的にスペースを割り当てるときに、十分なスペースがないため割り当てることができません。配列要素にアクセスするときに添え字が範囲外です。配列要素を開くときに、読み取り用のファイル、ファイルが存在しないなど。

これらの異常な状況を発見して対処しないと、プログラムがクラッシュする可能性があります。

いわゆる「処理」とは、エラー メッセージを表示し、プログラムがエラーのないパスに沿って実行を継続できるようにすることを意味する場合もあれば、プログラムを終了する必要があるが、その前に必要な作業を行うことを意味する場合もあります。メモリ内のデータをファイルに書き込む、開いているファイルを閉じる、動的に割り当てられたメモリ領域を解放するなど。

C では、例外処理メカニズムが導入されています。基本的な考え方は、関数 A が実行中に例外を見つけた場合、関数 A はそれを処理できず、単に A の呼び出し元 (関数 B であると想定) に「例外をスロー」するだけです。

例外を処理せずに例外をスローすると、関数 A がすぐに終了します。この場合、関数 B は、A によってスローされた例外をキャッチして処理するか、無視するかを選択できます。無視された場合、B の呼び出し元に例外がスローされます (以下同様)。

各レベルの関数が例外を処理しない場合、例外は最終的に最も外側の main 関数にスローされます。 main 関数は例外を処理する必要があります。 main 関数が例外を処理しない場合、プログラムは直ちに異常終了します。

C 例外処理の基本構文

C 例外処理は、 throw ステートメントと try...catch ステートメントによって実装されます。 throw ステートメントの構文は次のとおりです。

throw  表达式;
ログイン後にコピー

このステートメントは例外をスローします。例外は、値の型がプリミティブ型またはクラスである式です。


try...catch 语句的语法如下:
try {
    语句组
}catch(异常类型) {
  异常处理代码
}...catch(异常类型) {
    异常处理代码
}
ログイン後にコピー

複数のキャッチが存在する可能性がありますが、

には少なくとも 1 つの が必要です。

try と {} のコンテンツを「try ブロック」と呼び、catch と {} のコンテンツを「catch ブロック」と呼びます。

try... catch ステートメントの実行プロセスは次のとおりです: try ブロック内のステートメントを実行します。実行中に例外がスローされなかった場合、最後の catch ブロックに続くステートメントは実行後に実行され、catch ブロック内のすべてのステートメントは実行されません。 try ブロックの実行中に例外がスローされた場合、例外がスローされた直後に、スローされた例外のタイプと「例外のタイプ」が一致する最初の catch ブロックにジャンプして実行されます (例外がスローされると言われます)。 catch ブロックによって「キャッチ」された場合 ")、実行後、最後の catch ブロックの最後にジャンプして実行を続行します。

たとえば、次のプログラム:

#include <iostream>
using namespace std;
int main()
{
    double m ,n;
    cin >> m >> n;
    try {
        cout << "before dividing." << endl;
        if( n == 0)
            throw -1; //抛出int类型异常
        else
            cout << m / n << endl;
        cout << "after dividing." << endl;
    }
    catch(double d) {
        cout << "catch(double) " << d <<  endl;
    }
    catch(int e) {
        cout << "catch(int) " << e << endl;
    }
    cout << "finished" << endl;
    return 0;
}
ログイン後にコピー

プログラムの実行結果は次のとおりです:


9 6↙
before dividing.
1.5
after dividing.
finished
ログイン後にコピー

n が 0 以外の場合は例外がないことの説明は try ブロックにスローされます。したがって、try ブロックが正常に実行された後、プログラムはすべての catch ブロックを超えて実行を継続し、catch ブロックはいずれも実行されません。

プログラムの実行結果は次のようになります。


9 0↙
before dividing.
catch\(int) -1
finished
ログイン後にコピー

n が 0 の場合、try ブロックで整数例外がスローされます。例外がスローされた後、try ブロックは実行を直ちに停止します。整数例外は、型に一致する最初の catch ブロックによってキャッチされ、実行のために catch(int e) ブロックに入ります。catch ブロックの実行後、プログラムは正常に終了するまで実行を続けます。

スローされた例外が catch ブロックでキャッチされない場合、たとえば、catch(int e) を catch(char e) に変更すると、入力 n が 0 の場合、スローされる整数例外は次のようになります。 catch ブロックはそれをキャッチできますが、例外は処理されず、プログラムはすぐに終了し、try...catch の後のコンテンツは実行されません。

以上がC++ 例外処理メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート