C++ですべての例外をキャッチする方法を解説|catch(...)の使い方
例外とは、プログラムの実行時に発生する問題のことです。実行時(ランタイム)にスローされるイベントであり、適切に処理することで、例外が発生した後でもプログラムを継続して実行できます。このような例外に対処する仕組みが「例外処理」であり、try-catchブロックを使用することでコードを保護できます。
catchブロックは、あらゆる型の例外をキャッチするために使用されます。例外を捕捉するには「catch」というキーワードを使います。特に、catch(...) のように省略記号(...)を記述すると、スローされた例外の型に関わらず、すべての例外をキャッチすることが可能です。
以下は、C++ですべての例外をキャッチする例です。
サンプルコード
#include <iostream>
using namespace std;
void func(int a) {
try {
if(a==0) throw 23.33;
if(a==1) throw 's';
} catch(...) {
cout << "Caught Exception!\n";
}
}
int main() {
func(0);
func(1);
return 0;
}実行結果
上記プログラムの出力は以下の通りです。
Caught Exception! Caught Exception!
catch(...) のポイント
三点リーダー(...)を用いたcatchブロックは「キャッチオール(catch-all)」と呼ばれ、intやdouble、文字、さらには独自に定義したクラス型の例外など、あらゆる型の例外を受け取ります。このサンプルでは、関数funcに渡した引数が0の場合はdouble型の値(23.33)が、1の場合はchar型の値('s')がスローされますが、いずれもcatch(...)によって捕捉され、メッセージが出力されています。
ただし、catch(...)を使うと実際にどのような例外が発生したのかを判別できないため、デバッグの際には注意が必要です。実務では、具体的な型ごとのcatchブロックを先に記述し、catch(...)は最後の手段として配置するのが一般的なベストプラクティスとされています。
-
【初心者向け】C++の例外処理の仕組みを徹底解説!try・catch・throwの基本から独自例外の作成まで
C++における例外処理(Exception Handling)とは、プログラムの実行中に発生するエラー(ランタイムエラー)を適切に処理するための仕組みです。例外とは、実行時に送出されるイベントのことを指し、C++ではすべての標準例外が std::exception クラスを基底クラスとして定義されています。 もし例外を捕捉しなければ、プログラムは例外メッセージを出力した後に異常終了してしまいます。例外はハンドリング可能なランタイムエラーであり、適切に処理することでプログラムの堅牢性を大きく向上させることができます。 標準例外クラスの階層構造 C++標準では、例外は <exception&
-
Pythonのリスト内包表記で例外をキャッチするには?原因と対処法を解説
Pythonには、例外を処理したり無視したりするための組み込み関数は存在しません。そのため、リスト内包表記の中ですべての例外を処理することは不可能です。 その理由は、リスト内包表記が「式(expression)」で構成されている点にあります。例外のキャッチや無視、ハンドリングを行えるのは「文(statement)」である try〜except ブロックだけだからです。式の中に try-except を埋め込むことは、Pythonの文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中