Re: Handling Floating Point Exception in VC++ 6.0
You are missing some important parts of your code:
What is FloatException derived from?
You should select one of the exception models and stick to that:
The MFC model derives all exceptions (directly or indirectly) from
CException, throws "new" exception (throw new CxxxException()), and
catches by CException pointers (catch CException* e) . The exception
handler is responsible for calling e->Delete().
The C++ exception model is to derive from std::exception and throw by
value. The exceptions are caught by std::exception or std::exception&.
The exception handler does not need to do any exception clean-up.
What is the model you chose? Did you derive from CException or
std::exception, or is FloatException a class on its own?
More below.
SONET schrieb:
I've been trying to handle floating point exceptions but I am having some
problems.
Basically I am able to catch the exception with the catch(...), I wrote a
class that should be thrown but it is not working.
I basically coded the following class
FloatException::FloatException( int nSubCode )
{
subCode = nSubCode;
_fpreset();
}
void FloatException::FloatExceptionHandler( int sig, int nSubCode )
{
throw( new FloatException( nSubCode ) );
}
*********
You throw the exception by pointer: new FloatException(nSubCode). This
is the MFC model.
*********
void FloatException::SetFloatExceptionHandler()
{
// Get the current floating point control word.
//unsigned int uWord = _controlfp( 0, 0 );
unsigned int uWord = 0;
// Set the exceptions we want
uWord |= _EM_UNDERFLOW;
uWord |= _EM_OVERFLOW;
uWord |= _EM_ZERODIVIDE;
uWord |= _EM_INVALID;
_controlfp(uWord, _MCW_EM);
uWord = _controlfp( 0, 0 );
// Set the exception handler.
signal( SIGFPE, (void (__cdecl*)(int))FloatExceptionHandler );
}
in the main code I do this
FloatException::SetFloatExceptionHandler();
try
{
double temp = exp(99999999);
}
catch(FloatException& e)
********
but try to catch by reference, which is what I would do for Standard C++
exceptions. That does not fit, a "catch(FloatException& e)" will never
catch a FloatException pointer.
********
{
}
catch(...)
{
}
the problem is that it never hits the FloatException catch, and it never
executes the FloatExceptionHandler. it does get caught in the catch(...)
which didn't do before I wrote the code.
Is there something I am missing? Is there a better way to do floating point
exception.
I am running Windows XP on a Xeon. Does the processor matter?
No it does not.
Norbert