C でのエラー処理
この短い記事では、C 言語プログラムでエラーを処理するために使用できるさまざまな方法について説明します。
C でのエラー処理
エラー処理 (または例外処理) は C で直接サポートされていませんが、言語でエラーを処理する方法はまだあります。 プログラマーは、関数の戻り値をテストし、エラーの発生を最初から防止する必要があります。
これらの戻り値の簡単なテストは、すぐに実行できます。 たとえば、if ステートメントは、多くの C 関数呼び出しがエラーの場合に -1 または NULL を返すためです。
C 言語では、さまざまな種類のエラーを処理するためにさまざまなメソッドを使用できます。 それらのいくつかは、この記事で説明されています。
- グローバル変数
errnoを使用します。 - C 言語で
perror()およびstrerror() 関数を使用する。 - 関数の終了ステータスを使用します。
グローバル変数 errno を使用
グローバル変数 errno は、ライブラリ ファイル errorno.h で定義されています。 C プログラミング言語では、errno という変数に、発生したエラーを特定するためのコード (値) が自動的に割り当てられます。
エラーの種類は、errno のさまざまなコード (値) によって示されます。 以下は、いくつかの異なる errno 値とその説明のリストです。
| エラーコード | 説明 |
|---|---|
| 1 | この操作は許可されていません。 |
| 2 | ファイルまたはディレクトリが見つかりません。 |
| 3 | 関数が見つかりません。 |
| 4 | システムコールが中断されました。 |
| 5 | 入力または出力エラー。 |
| 6 | そのようなデバイスは見つかりませんでした。 |
| 7 | 渡された引数リストが指定よりも長くなっています。 |
| 8 | Exec 関数エラー。 |
| 9 | 不正なファイル番号エラー。 |
| 10 | チリのプロセスが見つかりません。 |
| 11 | もう一回やってみよう。 |
| 12 | メモリ不足エラー。 |
| 13 | アクセス許可が拒否されました。 |
存在しないファイルを開こうとするコード セグメントの例を考えてみましょう。 次に、errno 変数の値を確認します。
コード例:
#include <errno.h>
#include <stdio.h>
int main() {
FILE* file;
// we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
printf("The errorno Value is: %d\n ", errno);
return 0;
}
上記のコード例では、File のオブジェクトを作成し、fopen() 関数を呼び出して、読み取り用にファイルを開くことができるようにしました。 しかし、ディレクトリに見つからないファイル名を付けました。
そのため、エラーが発生し、errno 値が設定されます。 次に、その値を出力します。
出力:

出力から、返されるエラー番号は 2 です。 上記の表から、2 は "そのようなファイルまたはディレクトリが見つかりませんでした" を意味することがわかります。
perror() および strerror() 関数を使用する
発生したエラーの種類は、上で取得した errno 値によって示されます。
エラーの説明が必要な場合は、2つの関数を使用して、エラー番号にリンクされたテキスト メッセージを表示できます。 これらは perror() と strerror() です。
-
perror()関数は、エラーに関するユーザー定義のテキスト メッセージを表示し、続いてそのerrnoに設定された実際のメッセージを表示します。構文:
void perror(const char *str)strは、実際のエラー メッセージの前に表示する必要があるカスタム メッセージの文字列です。 -
strerrorは、渡されたerrnoに設定されたテキスト メッセージを返します。構文:
char *strerror(int errnum)errnumは、渡されるエラー番号です。
存在しないファイルを開く前の例を変更し、perror() と strerror() を介してエラー メッセージを表示します。
コード例:
#include <errno.h>
#include <stdio.h>
int main() {
FILE* file;
// we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
if (file == NULL) {
printf("Value of error number: %d\n", errno);
perror("Error message by perror");
printf("Error Message from strerror : %s\n", strerror(errno));
`
} else {
fclose(file);
}
return 0;
}
上記のコード セグメントでは、errno 値を出力し、次に perror を使用してエラー メッセージを出力し、次に strerror を使用しています。
出力:

EXIT_STATUSを使用
終了の成功または失敗を示すために、C 標準では、exit() に渡すことができる EXIT SUCCESS と EXIT FAILURE の 2つの定数マクロを指定しています。 これらのマクロは、stdlib.h にリストされているものです。
前の例をさらに変更し、ファイルが見つからず、ケース ファイルで成功した終了が見つかった場合は、失敗の終了呼び出しを行います。
コード例:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE* file;
// we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
if (file == NULL) {
int errorNumber = errno;
printf("Value of error number: %d\n", errno);
perror("Error message by perror");
printf("Error Message from strerror : %s\n", strerror(errno));
exit(EXIT_FAILURE);
} else {
fclose(file);
exit(EXIT_SUCCESS);
}
printf("Program exiting");
return 0;
}
上記のコード例では、条件ステートメントの両方のケースに exit 関数を含めています。プログラムが終了する直前に printf 関数を追加しました。
プログラムは以前に終了するため、このメッセージは出力されません。
出力:

まとめ
C では、例外処理が明示的にサポートされていません。 ただし、特定のエラー処理プリミティブ (つまり、ライブラリ関数) を使用して、C で十分な例外処理を実現できます。