C言語のエラー処理入門!errno・perror・strerrorの使い方を徹底解説
C言語におけるエラー処理の基本
C言語には、JavaやPythonのような例外処理(try-catch)といった組み込みのエラー処理機構が用意されていません。そのため、C言語では戻り値のチェックやグローバル変数「errno」などを活用して、独自にエラー処理を実装するのが一般的な手法となっています。
ヘッダーファイル「error.h」を使用すると、return文を通じてエラーメッセージを出力することができます。関数呼び出し時にエラーが発生した場合、多くの関数は-1またはNULLを返し、同時にerrno変数にエラーコードが設定されます。
errnoはグローバル変数であり、C言語で関数が呼び出されるたびに関連付けられます。プログラム実行中に発生したエラーの種類を特定するために利用されます。
主なエラーとエラーコードの一覧
代表的なエラーとそのエラー値は以下の表の通りです。
| 番号 | エラー内容とエラー値 |
|---|---|
| 1 | I/Oエラー 5 |
| 2 | ファイルまたはディレクトリが存在しない 2 |
| 3 | 引数リストが長すぎる 7 |
| 4 | メモリ不足 12 |
| 5 | アクセス権限がない 13 |
C言語でエラーを処理する主な方法
perror() − 発生したエラーを出力するための関数です。現在のerrno値に対応するテキスト形式のエラーメッセージを文字列とともに表示します。
strerror() − ヘッダーファイル「string.h」で宣言されている関数で、現在のerrno値に対応するエラーメッセージ文字列へのポインタを返します。
終了ステータス(Exit status) − EXIT_SUCCESSとEXIT_FAILUREという2つの定数が用意されており、exit()関数の引数として使用することで、呼び出し元の関数に対して正常終了か異常終了かを通知できます。
ゼロ除算 − C言語ではゼロによる除算のエラーを捕捉・回復する手段が存在しません。この種のエラーは事前に回避する必要があります。if文で除数が0でないことを確認してから除算を行うことで、未然に防ぐことが可能です。
C言語エラー処理のサンプルコード
以下は、ゼロ除算をチェックするエラー処理の実装例です。
#include <stdio.h>
#include <stdlib.h>
main() {
int x = 28;
int y = 8;
int z;
if( y == 0) {
fprintf(stderr, "Division by zero!\n");
exit(EXIT_FAILURE);
}
z = x / y;
fprintf(stderr, "Value of z : %d\n", z );
exit(EXIT_SUCCESS);
}
実行結果
上記プログラムの実行結果は以下の通りです。
Value of z : 3
このように、C言語では戻り値の確認、errnoの活用、exit()による終了ステータスの設定などを組み合わせることで、堅牢なエラー処理を実現できます。特にゼロ除算のように回復不能なエラーについては、事前に条件チェックを行い、問題が発生する前に適切に対処することが重要です。
-
0x0000C1F5ブルースクリーンエラーの原因と修正方法を徹底解説【Windows Vista対応】
0x0000C1F5のブルースクリーンエラーは、Windows Vista搭載PCの起動時に表示されることがある深刻なエラーで、主な原因はハードウェアドライバー同士の競合です。しかし、このエラーが発生しても安心してください。本記事で紹介する手順に従えば、システムに潜む問題を解消できる可能性は十分にあります。 0x0000C1F5ブルースクリーンエラーの原因 0x0000C1F5エラーは、共通ログファイルシステム(Common Log File System)のドライバー「Clfs.sys」が、破損した$TxfLogファイルを正しく修復できないことで発生します。ストップエラーのメッセージが表示
-
MULTIPLE_IRP_COMPLETE_REQUESTSエラー(0x00000044)の原因と解決方法
MULTIPLE_IRP_COMPLETE_REQUESTSエラーの修正方法:バグチェックコード0x00000044を伴うMULTIPLE_IRP_COMPLETE_REQUESTSエラーとブルースクリーンオブデス(BSOD)が発生している場合、これはドライバーがすでに完了しているIRP(I/O要求パケット)の完了を再度要求しようとしたことが原因です。この競合によってエラーメッセージが表示されます。つまり、本質的にはドライバーの問題であり、あるドライバーが自分自身のパケットを二重に完了させようとしている状態です。主な問題は、2つの異なるデバイスドライバーがそれぞれパケットの所有権を持っていると