C++の場合は try 〜 catch を使用します。
テスト.
#include <stdio.h>
#include "floatex.h"
void main(void)
{
unsigned int oldcw;
floatex_clear87();
oldcw = floatex_storecw();
floatex_loadcw(FEX_PC_64 | FEX_RC_NEAR);
try{
char buf[32],*pstop;
FLOATEX val;
// 数値を文字列として入力
printf("2 ÷ ");
scanf("%s",buf);
// 文字列を数値に変換できなかった場合
if (floatex_ldstr_strtold(buf,&pstop,val) || *pstop)
throw 1; // 例外を発生させ@に移る
// val = 2 ÷ val
floatex_ediv(fex_const_2,val,val); // 浮動小数点例外はAに移る
// 例外が発生しなかった場合の処理
floatex_ldstr_ldtoa(val,buf);
printf("結果:%s\n",buf);
}
catch(int){ // @
printf("数値に変換できません\n");
}
catch(...){ // A
char **pptbl;
int flags;
char *tbl[] = {
"無効操作", "デノーマル", "ゼロ除算", "オーバーフロー",
"アンダーフロー", "不正確結果", "スタックフォルト",
0
};
flags = floatex_exceptionflags(FEX_STAT_EXCEPTION);
pptbl = tbl;
do{
if (flags & 1)
printf("%s ",*pptbl);
pptbl++;
}while((flags >>= 1) != 0);
}
floatex_ldstr_term();
floatex_loadcw(oldcw);
}
try ブロック内で例外が発生すると、catch ブロックに処理が移ります。プログラムが例外を発生させる場合は throw を用います。
catch に続く括弧が省略記号 " ... "(ピリオドが3つ。上記A)のものは、あらゆる例外をキャッチします。浮動小数点演算の例外は、その中で処理します。
複数の catch ブロックがある場合は、省略記号の catch ブロックを最後に記述する必要があります。