C/400

87. エラーの出力方法と errno のテキスト

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)
調べることによって詳しい手がかりを得ることができるのである。