C言語エラーハンドリングのマスター:ベストプラクティスとテクニック
C言語自体はエラーハンドリングの直接的なサポートを提供しませんが、システムプログラミング言語として、戻り値という形で低レベルなアクセスを提供します。ほとんどのCやUnixの関数呼び出しは、エラー時に-1やNULLを返し、エラーコードをerrnoに設定します。これはグローバル変数として、関数呼び出し時にエラーが発生したことを示します。様々なエラーコードは<error.h>ヘッダーファイルで定義されています。
Cプログラマは戻り値をチェックし、戻り値に応じた適切な対応を取れます。プログラム初期化時にerrnoを0に設定しておくのは良い習慣です。0はプログラムにエラーがないことを意味します。
errno、perror()、strerror()
C言語はperror()とstrerror()関数を提供し、errnoに関連付けられたテキストメッセージを表示できます。
perror()関数は、渡された文字列に続けてコロン、スペース、現在の
errno値のテキスト表現を出力します。strerror()関数は、現在の
errno値のテキスト表現へのポインタを返します。
存在しないファイルを開こうとしてエラーをシミュレートし、両関数の使い方を示します(どちらか一方でも構いません)。重要な点として、エラー出力には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>
int 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);
return 0;
}
実行結果:
Division by zero! Exiting...
プログラム終了ステータス
正常終了時はEXIT_SUCCESS(マクロで0と定義)で終了するのが一般的です。エラー発生時はEXIT_FAILURE(-1と定義)で終了すべきです。上記プログラムを書き直すと:
#include <stdio.h>
#include <stdlib.h>
int 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);
return 0;
}
実行結果:
Value of quotient : 4
C言語
- 動力伝達ベルトの保管・取り扱いベストプラクティス
- マテリアルハンドリングの理解:主要概念とベストプラクティス
- マテリアルハンドリング機器の4大カテゴリー:保管・システム・トラック・散装
- マテリアルハンドリング安全の極意:効率的でリスクフリーな作業のためのベストプラクティス
- ADCコードエラー率(CER)を理解する:知っておくべきポイント
- C言語 ファイル入出力: fopen, fprintf, fread, fseek をマスターする
- C#ファイル操作実践ガイド:存在確認、読み書き、コピー、削除
- C++シグナル処理をマスター:安全な割り込み管理とクリーンなプログラム終了
- C#の例外処理:try/catch/finally/throwとベストプラクティス
- Python例外処理をマスター:包括的ガイド
- Java例外ハンドリング完全攻略:try-catch、finally、throw、throws