C/400

64. C400 のエラー・モニター

C 言語でのエラー監視は #pragma exception_handler によって
エスケープ・メッセージ( _C2_MH_ESCAPE ) を #pragma disable_handler までのあいだか、
または次の #pragma exception_handler のまでのあいだを、
監視して障害が発生すれば指定したタグ( MONMSG ) へジャンプさせることができる。

【 C/400 : TESTMON 】
--------------------------------------------------------------------------
0001.00 #include <stdio.h>                                          
0002.00 #include <stdlib.h>                                         
0003.00 #include <string.h>                                         
0004.00 #include <signal.h>                                         
0005.00 #include <errno.h>                                          
0006.00                                                                   
0007.00 #define TRUE         0                                            
0008.00 #define FALSE       -1                                            
0009.00   volatile _INTRPT_Hndlr_Parms_T ca;                              
0010.00                                                                   
0011.00 void main(void){                                                  
0012.00     int tanka, kin = 8000;                                        
0013.00     int su = 0;                                                   
0014.00                                                                   
0015.00     #pragma exception_handler(MONMSG, ca, 0, _C2_MH_ESCAPE, \     
0016.00                                        _CTLA_HANDLE)              
0017.00     printf("** TESTMON **\n");                                    
0018.00     getchar();                                                    
0019.00     tanka = kin / su;                                             
0020.00     return;                                                       
0021.00                                                                   
0022.00 MONMSG:                                                           
0023.00    #pragma disable_handler                                        
0024.00    printf("[ERR]  行 %d  でエラーが発生しました。 \n", __LINE__); 
0025.00    printf("    ==> %s\n", strerror(errno)); /* perror の代わり */ 
0026.00    exit(-1);                                                      
0027.00 }                                                                 
--------------------------------------------------------------------------
【 解説 】

エラー・メッセージを取り出すには、一般的には perror("xxx"); が使用されるがperror("xxxx"); では
標準出力 ( STDOUT ) ではなく エラー出力 ( STDERR ) となるため印刷スプールが別になってしまう。
ここでは

0005.00 #include <errno.h>
             :
       strerror(errno)

を使用している。strerror(errno)perror で出力されるのと同じ内容を出力することができるからである。
また __LINE__ は予約語であり __LINE__ が実行される行のステートメント NO である。
上記のサンプルの場合では __LINE__ の値は 24 である。
エラーの発生した行番号を C 言語で検出する方法は残念ながらない。