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 で十分な例外処理を実現できます。