C/400における標準的な推薦されるエラー・メッセージの出力方法と
errno のテキストについて紹介しよう。
次のサンブル・ソースを見ていただきたい。
【 TESTERRN :エラーの出力サンプル】
0001.00 #include <stdio.h> 0002.00 #include <stdlib.h> 0003.00 #include <string.h> 0004.00 #include <errno.h> 0005.00 0006.00 #define TRUE 0 0007.00 #define FALSE -1 0008.00 #define __PGM__ &__FILE__[13] 0009.00 0010.00 void main(void){ 0011.00 0012.00 printf("** TESTERRN: ERRNO の検索 **\n"); 0013.00 getchar(); 0014.00 errno = 3407; 0015.00 fprintf(stderr, "%s-%d:%s\n", __PGM__, __LINE__, strerror(errno)); 0016.00 getchar(); 0017.00 }
【実行結果】
** TESTERRN: ERRNO の検索 ** > (TESTERRN)-15: 関数呼び出しが中断された。
【解説】
-
1. エラーの出力は fprintf( stderr, .. ) で出力する。
- エラーの出力を printf 文ではなく fprintf( stderr, … ) によって出力しているのは
- 標準出力 printf が別の場所をリダイレクトされてしまっているときでもstderr であれば正しく印刷出力することができる。
- stderr であればエラー出力だけを同じ場所に集めて出力される。
-
2. プログラム名を __PGM__ で出力する。
-
0008.00 #define __PGM__ &__FILE__[13]
によってソース・ファイルの一部を抜き出して __PGM__ をプログラム名として出力している。
エラー・メッセージを見ただけでは、どのプログラムのエラーであるかわからず、
直ちに調査を開始することはできない。
従ってエラー・メッセージにはプログラム名も併せて出力しておいたほうが良い。
-
3. ステートメント行を __LINE__ で出力する。
- プログラムのソース・ステートメント行を __LINE__ で出力しておけば
そのプログラムのどの場所でエラーが発生したのかがすぐにわかるので
これは便利な機能である。
-
4. エラー内容を strerror(errno) で出力する。
- システム・エラーが発生したときに i5/OS は予約語の errno にエラー番号を代入する。
errno だけではエラーの内容はわからないので、strerror(errno) を出力するように
すれば日本語で 「 関数呼び出しが中断された。」 と出力されるのでわかりやすくなる。
ただしこの日本語訳があまり適切でないこともあるため、意味不明な場合がある。
そのようなときには
ソース・メンバー QSYSINC/H(ERRNO)
を調査すればよい。いったん errnoの値を出力したから errno = 3470 であると判明すると
- ソース・メンバー QSYSINC/H(ERRNO) の英文を調べる。
- ソース・メンバー QSYSINC/H(ERRNO) の #define によってインターネットでLinux の日本語訳を調べる
という方法がある。
つまり日本語エラー・メッセージの意味が不明であれば QSYSINC/H(ERRNO) を
調べることによって詳しい手がかりを得ることができるのである。