C400

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)

調べることによって詳しい手がかりを得ることができるのである。