「Cpp 例外処理」の版間の差分

提供:yonewiki
(ページの作成:「C++に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++ 例外処理</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> </tr>…」)
 
 
11行目: 11行目:
<br />
<br />
== '''例外処理''' ==
== '''例外処理''' ==
 C++の例外処理は、プログラム実行中に発生するエラーや異常な状態に対処するための仕組みです。例外処理は、エラーが発生した箇所からエラーを処理するためのコードブロック(例外ハンドラ)に制御が移ることで、プログラムの安定性を向上させる役割を果たします。以下に、C++の例外処理に関する基本的な解説とコード例を示します。


'''例外の発生と捕捉:'''
 C++では、try ブロックで例外が発生する可能性のあるコードを囲み、catch ブロックで例外を捕捉して処理します。また、throw ステートメントを使用して明示的に例外を発生させることもできます。
<syntaxhighlight lang="cpp">
#include <iostream>
#include <stdexcept>
int main() {
    try {
        // 例外が発生する可能性のあるコード
        int numerator, denominator;
        std::cout << "Enter numerator: ";
        std::cin >> numerator;
        std::cout << "Enter denominator: ";
        std::cin >> denominator;
        if (denominator == 0) {
            throw std::runtime_error("Division by zero is not allowed.");
        }
        double result = static_cast<double>(numerator) / denominator;
        std::cout << "Result: " << result << std::endl;
    } catch (const std::exception& e) {
        // 例外ハンドラ
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }
    return 0;
}
</syntaxhighlight>
 この例では、ユーザによって入力された分母が0の場合に std::runtime_error 例外が発生するようにしています。catch ブロックでは、std::exception クラスを基底クラスとして、標準的な例外クラスを捕捉しています。
'''カスタム例外クラスの作成:'''
 プログラム独自の例外クラスを作成することもできます。これにより、特定のエラー条件に対処するための細かい制御が可能になります。
<syntaxhighlight lang="cpp">
#include <iostream>
#include <stdexcept>
class MyException : public std::exception {
public:
    const char* what() const noexcept override {
        return "Custom exception: Something went wrong.";
    }
};
int main() {
    try {
        // 例外が発生する可能性のあるコード
        throw MyException();
    } catch (const std::exception& e) {
        // 例外ハンドラ
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }
    return 0;
}
</syntaxhighlight>
'''catch 節の順序:'''
try ブロックで複数の種類の例外が発生する場合、catch 節の順序が重要です。最も派生した例外クラスの catch 節から順に評価され、最初にマッチしたものが実行されます。
<syntaxhighlight lang="cpp">
try {
    // ...
} catch (const DerivedException& e) {
    // DerivedException を捕捉
} catch (const BaseException& e) {
    // BaseException を捕捉
}
</syntaxhighlight>
 このように、catch 節を書くときは、より具体的な例外クラスから始め、基底クラスに続けて書くのが一般的です。
 C++の例外処理は強力で柔軟な仕組みですが、適切な使い方が求められます。過剰な例外の使用はプログラムの可読性を低下させ、パフォーマンスにも悪影響を及ぼす可能性があるため、慎重に扱うことが重要です。
 


[[C PlusPlus#C++からの技術|C++]]に戻る
[[C PlusPlus#C++からの技術|C++]]に戻る

2024年2月28日 (水) 00:09時点における最新版

C++に戻る


本来の表記は「C++ 例外処理」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。

※このページではC++にのみ存在する機能として、記事タイトルがC++ 例外処理になっています。

例外処理

 C++の例外処理は、プログラム実行中に発生するエラーや異常な状態に対処するための仕組みです。例外処理は、エラーが発生した箇所からエラーを処理するためのコードブロック(例外ハンドラ)に制御が移ることで、プログラムの安定性を向上させる役割を果たします。以下に、C++の例外処理に関する基本的な解説とコード例を示します。


例外の発生と捕捉:

 C++では、try ブロックで例外が発生する可能性のあるコードを囲み、catch ブロックで例外を捕捉して処理します。また、throw ステートメントを使用して明示的に例外を発生させることもできます。


#include <iostream>
#include <stdexcept>

int main() {
    try {
        // 例外が発生する可能性のあるコード
        int numerator, denominator;
        std::cout << "Enter numerator: ";
        std::cin >> numerator;
        std::cout << "Enter denominator: ";
        std::cin >> denominator;

        if (denominator == 0) {
            throw std::runtime_error("Division by zero is not allowed.");
        }

        double result = static_cast<double>(numerator) / denominator;
        std::cout << "Result: " << result << std::endl;
    } catch (const std::exception& e) {
        // 例外ハンドラ
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }

    return 0;
}


 この例では、ユーザによって入力された分母が0の場合に std::runtime_error 例外が発生するようにしています。catch ブロックでは、std::exception クラスを基底クラスとして、標準的な例外クラスを捕捉しています。


カスタム例外クラスの作成:

 プログラム独自の例外クラスを作成することもできます。これにより、特定のエラー条件に対処するための細かい制御が可能になります。


#include <iostream>
#include <stdexcept>

class MyException : public std::exception {
public:
    const char* what() const noexcept override {
        return "Custom exception: Something went wrong.";
    }
};

int main() {
    try {
        // 例外が発生する可能性のあるコード
        throw MyException();
    } catch (const std::exception& e) {
        // 例外ハンドラ
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }

    return 0;
}


catch 節の順序:

try ブロックで複数の種類の例外が発生する場合、catch 節の順序が重要です。最も派生した例外クラスの catch 節から順に評価され、最初にマッチしたものが実行されます。


try {
    // ...
} catch (const DerivedException& e) {
    // DerivedException を捕捉
} catch (const BaseException& e) {
    // BaseException を捕捉
}


 このように、catch 節を書くときは、より具体的な例外クラスから始め、基底クラスに続けて書くのが一般的です。


 C++の例外処理は強力で柔軟な仕組みですが、適切な使い方が求められます。過剰な例外の使用はプログラムの可読性を低下させ、パフォーマンスにも悪影響を及ぼす可能性があるため、慎重に扱うことが重要です。

 

C++に戻る