Cprogramming-c-error-handling
C-エラー処理
そのため、Cプログラミングはエラー処理を直接サポートしていませんが、システムプログラミング言語であるため、戻り値の形式で低レベルでアクセスできます。 CまたはUnix関数呼び出しのほとんどは、エラーが発生した場合に-1またはNULLを返し、エラーコード errno を設定します。 グローバル変数として設定され、関数呼び出し中にエラーが発生したことを示します。 <error.h>ヘッダーファイルで定義されているさまざまなエラーコードを見つけることができます。
そのため、Cプログラマーは戻り値を確認し、戻り値に応じて適切なアクションを実行できます。 プログラムの初期化時にerrnoを0に設定することをお勧めします。 値0は、プログラムにエラーがないことを示します。
errno、perror()。 およびstrerror()
Cプログラミング言語は、 errno に関連付けられたテキストメッセージを表示するために使用できる* perror()および strerror()*関数を提供します。
- * perror()*関数は、渡された文字列を表示し、その後にコロン、スペース、そして現在のerrno値のテキスト表現が続きます。
- * strerror()*関数。現在のerrno値のテキスト表現へのポインターを返します。
エラー状態をシミュレートして、存在しないファイルを開いてみましょう。 ここでは、両方の機能を使用して使用方法を示していますが、エラーを出力する1つ以上の方法を使用できます。 2つ目の重要な点は、 stderr ファイルストリームを使用してすべてのエラーを出力する必要があることです。
#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno ;
int main () {
FILE * pf;
int errnum;
pf = fopen ("unexist.txt", "rb");
if (pf == NULL) {
errnum = errno;
fprintf(stderr, "Value of errno: %d\n", errno);
perror("Error printed by perror");
fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
} else {
fclose (pf);
}
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory
ゼロエラーで除算する
一般的な問題は、任意の数を分割するときに、プログラマが除数がゼロであるかどうかをチェックせず、最終的に実行時エラーが発生することです。
以下のコードは、除算する前に除数がゼロかどうかを確認することでこれを修正します-
#include <stdio.h>
#include <stdlib.h>
main() {
int dividend = 20;
int divisor = 0;
int quotient;
if( divisor == 0){
fprintf(stderr, "Division by zero! Exiting...\n");
exit(-1);
}
quotient = dividend/divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient );
exit(0);
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Division by zero! Exiting...
プログラム終了ステータス
操作が成功した後にプログラムが出てくる場合、EXIT_SUCCESSの値で終了するのが一般的な方法です。 ここで、EXIT_SUCCESSはマクロであり、0として定義されています。
プログラムにエラー状態があり、出てくる場合は、-1として定義されたステータスEXIT_FAILUREで終了する必要があります。 次のように上記のプログラムを書いてみましょう-
#include <stdio.h>
#include <stdlib.h>
main() {
int dividend = 20;
int divisor = 5;
int quotient;
if( divisor == 0) {
fprintf(stderr, "Division by zero! Exiting...\n");
exit(EXIT_FAILURE);
}
quotient = dividend/divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient );
exit(EXIT_SUCCESS);
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Value of quotient : 4