【C++】set_terminate()でキャッチされなかった例外の終了動作をカスタマイズする方法
このチュートリアルでは、C++における「キャッチされなかった例外(未処理例外)」の終了動作をカスタマイズする方法について解説します。
通常、例外はtry-catchブロックによって処理されます。しかし、スローされた例外の型に対応するcatchブロックが存在しない場合、プログラムはstd::terminate()関数を呼び出して強制終了します。このterminate()のデフォルト動作は、set_terminate()関数を使うことで、ユーザーの要件に応じて自由に変更することが可能です。
サンプルコード
#include <exception>
#include <iostream>
using namespace std;
// カスタムterminateハンドラの定義
void myhandler(){
cout << "Inside new terminate handler\n";
abort();
}
int main(){
set_terminate(myhandler);
try {
cout << "Inside try block\n";
throw 100;
}
catch (char a){
cout << "Inside catch block\n";
}
return 0;
}
実行結果
Inside try block
Inside new terminate handler
コードの解説
このプログラムの流れを順番に見ていきましょう。
1. カスタムハンドラの登録
set_terminate(myhandler)を呼び出すことで、自作の関数myhandler()が新しいterminateハンドラとして登録されます。以降、未処理例外が発生した際には、デフォルトの動作の代わりにこの関数が実行されます。
2. 例外のスローと型の不一致
tryブロック内ではthrow 100によってint型の例外がスローされます。しかし、catchブロックではchar型の例外しか受け取らないため、型が一致せず、この例外はどこでもキャッチされません。
3. terminateハンドラの呼び出し
キャッチされなかった例外はstd::terminate()の呼び出しにつながり、登録しておいたmyhandler()が実行されます。その結果、メッセージが出力された後、abort()によってプログラムが異常終了します。
まとめ
このようにset_terminate()を活用すれば、未処理例外が発生したときの挙動を柔軟に制御できます。ログの記録や独自のエラーメッセージ表示など、デフォルトのabort()だけでは実現できない処理を組み込みたい場合に非常に有効なテクニックです。
-
C++の例外処理入門!try・catch・throwの基本と標準例外クラス一覧
C++における例外処理(Exception Handling)とは、プログラムの実行時に発生するエラー(ランタイムエラー)を適切に扱うための仕組みです。例外とは、実行時に送出(スロー)されるイベントのことで、C++ではすべての標準例外が std::exception クラスから派生しています。もし例外を捕捉しなかった場合、例外メッセージが出力され、プログラムは強制終了してしまいます。 C++標準では、例外関連のクラスが <exception> ヘッダに定義されており、プログラムの中で自由に利用できます。親子関係によるクラス階層は次のようになっています。 C++の主な標準例外クラス
-
【初心者向け】C++の例外処理の仕組みを徹底解説!try・catch・throwの基本から独自例外の作成まで
C++における例外処理(Exception Handling)とは、プログラムの実行中に発生するエラー(ランタイムエラー)を適切に処理するための仕組みです。例外とは、実行時に送出されるイベントのことを指し、C++ではすべての標準例外が std::exception クラスを基底クラスとして定義されています。 もし例外を捕捉しなければ、プログラムは例外メッセージを出力した後に異常終了してしまいます。例外はハンドリング可能なランタイムエラーであり、適切に処理することでプログラムの堅牢性を大きく向上させることができます。 標準例外クラスの階層構造 C++標準では、例外は <exception&