默认情况下,系统屏蔽了浮点数/整数运算时的异常错误,并以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;
}

嘻嘻,就到这里吧!