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