Cpp 例外処理
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++に戻る