C++の例外処理(Exception Handling)とは?try/catch/throwでエラーに強いプログラムを作ろう
プログラムを実行していると、予期せぬエラーが発生することがあります。
C++では、そうしたエラーに対応するために「例外処理(Exception Handling)」という仕組みが用意されています。
この記事では、try
/ catch
/ throw
の基本的な使い方から、独自の例外クラス、注意点まで、初心者向けに解説します。
例外処理とは?
例外処理とは、エラーが発生したときに、通常の処理から分岐して安全に処理を続行または終了するための仕組みです。
C++では主に以下の3つのキーワードを使って行います。
try
:例外が発生するかもしれない処理を囲む
throw
:例外を発生させる
catch
:発生した例外を受け取り処理する
基本構文と例
#include <iostream>
using namespace std;
int divide(int a, int b) {
if (b == 0) {
throw "ゼロ除算エラー";
}
return a / b;
}
int main() {
try {
int result = divide(10, 0);
cout << "結果: " << result << endl;
} catch (const char* msg) {
cout << "例外発生: " << msg << endl;
}
return 0;
}
この例では、0で割ろうとしたときに throw
で例外を発生させ、それを catch
が受け取って処理しています。
複数のcatchを使う
C++では、型ごとに異なるcatch文を記述できます。
try {
// 処理
} catch (int e) {
cout << "整数の例外: " << e << endl;
} catch (const char* msg) {
cout << "文字列の例外: " << msg << endl;
}
catch(...) で全ての例外を受け取る
try {
// 処理
} catch (...) {
cout << "不明な例外を捕捉" << endl;
}
catch(...)
は、型に関係なくあらゆる例外を捕捉するための文法です。
標準の例外クラス
C++では <stdexcept>
ヘッダに標準の例外クラスが用意されています。
std::runtime_error
std::out_of_range
std::invalid_argument
std::logic_error
など
#include <stdexcept>
throw std::runtime_error("実行時エラーです");
独自の例外クラスを作る
独自の例外を作るには、std::exception
を継承したクラスを作成します。
#include <exception>
class MyException : public std::exception {
public:
const char* what() const noexcept override {
return "独自の例外が発生しました";
}
};
int main() {
try {
throw MyException();
} catch (const MyException& e) {
cout << e.what() << endl;
}
}
例外処理のメリット
- 異常な動作を安全に分離できる
- エラー発生箇所と処理箇所を分けて記述できる
- ライブラリや関数内で発生したエラーを伝播できる
注意点
- パフォーマンスに影響するため、頻繁な例外使用は避ける
- 例外が補足されないとプログラムが異常終了する
- 例外処理の設計は過不足のない粒度で行うことが重要
まとめ
C++の例外処理は、予期せぬエラーを安全に処理するための重要な仕組みです。
try
/ throw
/ catch
の基本を押さえれば、より堅牢なコードが書けるようになります。
まずは基本の構文でゼロ除算や範囲外アクセスなどを扱いながら、std::exception
や独自例外クラスの活用へとステップアップしていきましょう!