「Cpp 例外処理」の版間の差分
(ページの作成:「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++に戻る