默认情况下,系统屏蔽了浮点数/整数运算时的异常错误,并以0或者无穷大表示结果,并不会产生异常。
这些数值计算异常列表如下:
_EM_INVALID
_EM_DENORMAL
_EM_ZERODIVIDE
_EM_OVERFLOW
_EM_UNDERFLOW
_EM_INEXACT
为了捕获上述异常,必须使用 _controlfp(...)/_control87(...) 运行库函数设置相关的屏蔽位,代码示例如下:
// ZeroDivide.cpp : By YangTze!
//
#include "stdafx.h"
#include
#include
#include
void TestFunc()
{
int i = 888;
int j = 0;
__try {
i = i/j;
}
__except( GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) {
MessageBox( NULL,"EXCEPTION_INT_DIVIDE_BY_ZERO!","Error!",MB_OK );
}
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int nOldMask;
unsigned int nNewMask;
nOldMask = _controlfp( 0,0 );
nNewMask = ( ( nOldMask & ~_EM_ZERODIVIDE ) | ( _EM_ZERODIVIDE & _MCW_EM ) );
_controlfp( nNewMask,_MCW_EM );
TestFunc();
_controlfp( _CW_DEFAULT, 0xfffff );
return 0;
}
嘻嘻,就到这里吧!
浙公网安备 33010602011771号