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 言語で検出する方法は残念ながらない。