C言語でtry-catchによるエラー処理をマスターする:実践ガイド

「try」と「catch」という言葉は、プログラムがコードやデータの問題によって例外(エクセプション)に遭遇した際の対処方法を表しています。例外はコード内のtryブロックで発生し、catchブロックがその例外を検出して処理する役割を担います。try-catch構文は、Python、C++、JavaScriptなど、多くのプログラミング言語で採用されています。
本記事では、try-catch文の基本的な仕組みを解説し、C言語での実装例を交えながら具体的な使い方をご紹介します。
try-catch文とは?
tryステートメントは、例外を引き起こす可能性のある一連の処理を定義するためのものです。特定の種類の例外が発生すると、その例外はcatchブロックへ送られます。もしtry/catchブロックで例外が適切に処理されなかった場合、コンパイラはエラーメッセージを出力するか、あるいは例外が対処されるまで呼び出しスタックをさかのぼり続けることになります。
try-catch文の一般的な構文は以下のとおりです。
try {
/*
エラーが発生する可能性のあるコードを記述
*/
}
catch {
/*
発生したエラーを処理するコードを記述
*/
}
C言語におけるtry-catch文とは?
残念ながら、C言語は例外処理を標準ではサポートしていません。組み込みの例外処理メカニズムが存在しないためです。しかし、setjmpとlongjmpという2つの関数呼び出しを利用することで、一定レベルまでこの仕組みを模倣することが可能です。なお、スタックを遡った後のメモリ解放の仕組みがないまま例外処理を実装すると、効率的にも安全性にも問題が生じます。C言語にはガベージコレクタがないため、メモリ(RAM)を解放するには、コンテキストマネージャ的な仕組みも併せて導入する必要があります。
ここからは、コードを少しずつ改善しながら、ソリューションを段階的に構築していきましょう。使用するのは、setjmp.hヘッダーファイルで提供されているsetjmpとlongjmpの2つの関数です。setjmp関数はjmp_buf型の変数を受け取り、直接呼び出された場合は0を返します。一方、同じjmp_buf変数を使ってlongjmpを2つの引数付きで呼び出すと、setjmp関数はlongjmpの第2引数と同じ値を返すようになります。
実際の実装例は以下のとおりです。
#include <stdio.h>
#include <setjmp.h>
#define TRY do { jmp_buf buf_state; if ( !setjmp(buf_state)) {
#define CATCH } else {
#define ENDTRY }} while(0)
#define THROW longjmp(buf_state, 1)
int main()
{
TRY {
printf("Try statement testing\n");
THROW;
printf("Statement should not appear, as the THROW block has already thrown the exception \n");
}
CATCH {
printf("Got Exception \n");
}
ENDTRY;
return 0;
}
このCプログラムでは、ENDTRYマクロがdo-whileブロックの閉じ部分を担っています。

まとめ
「try」と「catch」は、プログラムの実行中にデータやコードの誤りによって例外が発生した際の管理方法を定義するものです。例外はtryブロック内で発生し、catchブロックがそこから伝わってきたエラーを検出・処理します。try-catch構文は多くのプログラミング言語でサポートされていますが、C言語には標準搭載されていません。本ガイドでは、setjmp/longjmpを活用してC言語でもtry-catch風の例外処理を実現する方法を解説しました。ぜひ実際のコードで試してみてください。
著者について

Komal Batool Batool
テクノロジーや新しいアイデアの探求に情熱を注ぐライターです。LinuxHintでは、主にプログラミング言語やコンピュータサイエンス関連のトピックを担当しています。
-
【C言語】strncpy()関数とは?基本から実践的な使い方まで解説
strncpy()関数とはC言語の標準ライブラリ関数 char *strncpy(char *dest, const char *src, size_t n) は、srcが指す文字列からdestへ最大n文字をコピーする関数です。もしsrcの長さがnより短い場合は、コピー後のdestの残りの領域がヌルバイト(\0)で埋められます。なお、C言語において文字の配列は「文字列」と呼ばれます。文字列の宣言文字列(文字型配列)の宣言は以下のように行います。char stringname[サイズ];たとえば、char string[50];と記述すれば、最大50文字を格納できる文字列が宣言できます。文字列の
-
C言語で行列をジグザグ(波状)形式に出力する方法
行数と列数を持つ行列 mat[row][col] が与えられたとき、その行列を下の図のようにジグザグ(波状)形式で出力する必要があります。 期待される出力は以下のとおりです。 Output: 10 20 40 70 50 30 60 80 90 この問題に対しては、行列を対角線に沿って走査し、1本の対角線の要素を出力し終えるたびに走査方向を反転させるというシンプルなアプローチを採用しています。 アルゴリズム 開始 ステップ1:k = 3、l = 3 を宣言して設定する ステップ2:行列 mat[][3] を宣言する ステップ3:row = 0、col = 0、flag = false を宣言