例外処理の実装
またまた古いTurboCのネタです。
例外処理が使えないので作ってみました。
ソース
include<setjmp.h>
jmp_buf try_env;
int TRY_RETURN;
int TRY_SET_FLAG=0;
#define TRY if((TRY_RETURN=setjmp(try_env))==0 &&
(TRY_SET_FLAG=1))
#define CATCH(e) else if((e=TRY_RETURN) &&
(TRY_SET_FLAG=0))
#define THROW(e) if(TRY_SET_FLAG==1)(TRY_SET_FLAG=0),longjmp(try_env,e);\
else puts("THROWの呼び出しが不正です。\n"),exit(0);
このようにマクロを定義して使うときは次のようにします。
void hoe()
{
THROW(1);//例外発生
printf("ほえ〜\n");
}
void main()
{
int e;
TRY{
hoe();
printf("はにゃ〜ん\n");
}CATCH(e){
if(e==1)
printf("例外発生!\n");
}
printf("終了\n");
}
CATCHの中でCATCH(int e)とかけないのが残念だけど、とりあえずは使えるかと。
C++でないCコンパイラでも使用可能です。
ただC++では注意しないといけません。
あくまでもsetjmpでスタックを覚えて復元するだけなのでガベージコレクションが
呼べません。
つまりTRYの後にクラスオブジェクトを作るとデストラクタが実行されないわけです。
(悪い例)
TRY{
String s;
Hoe(s);
}
(良い例)
String s;
TRY{
Hoe(s);
}
ただTRYの後の関数の中でクラスオブジェクトを作っていたりするとこの方法
だけでは解決しません。
気をつけましょう。