Figure 4: Shows implementation of function WinException

// COPYRIGHT (c) 1997, TRIAD Systems, Inc. Permission is granted
// to use this code as long as this copyright notice appears in
// all source files

void EXBase_c::WinException(unsigned int u,
  EXCEPTION_POINTERS* pExp)
{
  stringstream What;
  string Where(BUFSIZ,'\0');
  HMODULE hModule = GetModuleHandle(NULL);
  GetModuleFileName(hModule,const_cast<char*>(Where.c_str()),
    Where.size());
  long lError = 0;
  switch(pExp->ExceptionRecord->ExceptionCode)
  {
    case EXCEPTION_ACCESS_VIOLATION:
         if(pExp->ExceptionRecord->ExceptionInformation[0])
           lError = ACCESS_VIOLATION_WRITE;
         else
           lError = ACCESS_VIOLATION_READ;
         break;
    case EXCEPTION_DATATYPE_MISALIGNMENT:
         lError = DATATYPE_MISALIGNMENT;
         break;
    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
         lError = ARRAY_BOUNDS_EXCEEDED;
         break;
    case EXCEPTION_FLT_DENORMAL_OPERAND:
         lError = FLOAT_DENORMAL_OPERAND;
         break;
    case EXCEPTION_FLT_DIVIDE_BY_ZERO:
         lError = FLOAT_DIVIDE_BY_ZERO;
         break;
    case EXCEPTION_FLT_INVALID_OPERATION:
         lError = FLOAT_INVALID_OPERATION;
         break;
    case EXCEPTION_FLT_OVERFLOW:
         lError = FLOAT_OVERFLOW;
         break;
    case EXCEPTION_FLT_STACK_CHECK:
         lError = FLOAT_STACK_CHECK;
         break;
    case EXCEPTION_FLT_UNDERFLOW:
         lError = FLOAT_UNDERFLOW;
         break;
    case EXCEPTION_INT_DIVIDE_BY_ZERO:
         lError = INT_DIVIDE_BY_ZERO;
         break;
    case EXCEPTION_INT_OVERFLOW:
         lError = INT_OVERFLOW;
         break;
    case EXCEPTION_PRIV_INSTRUCTION:
         lError = PRIV_INSTRUCTION;
         break;
    case EXCEPTION_IN_PAGE_ERROR:
         lError = IN_PAGE_ERROR;
         break;
    case EXCEPTION_ILLEGAL_INSTRUCTION:
         lError = ILLEGAL_INSTRUCTION;
         break;
    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
         lError = NONCONTINUABLE_EXCEPTION;
         break;
    case EXCEPTION_STACK_OVERFLOW:
         lError = STACK_OVERFLOW;
         break;
    case EXCEPTION_INVALID_DISPOSITION:
         lError = INVALID_DISPOSITION;
         break;
    case EXCEPTION_GUARD_PAGE:
         lError = GUARD_PAGE;
         break;
    case EXCEPTION_INVALID_HANDLE:
         lError = INVALID_HANDLE;
         break;
    default:
         EXSystem_c(__LINE__,__FILE__,UNKNOWN_EXCEPTION,EXFatal);
         m_OldSEHandler(u,pExp); // CALL THE PREVIOUS HANDLER, 
                                 // SINCE WE REALLY DON'T CARE 
                                 // ABOUT THESE
         break;
  }
  What << "The error occurred at address " 
       << pExp->ExceptionRecord->ExceptionAddress << " of file " 
       << Where;
  if(pExp->ExceptionRecord->ExceptionFlags == 
      EXCEPTION_NONCONTINUABLE)
  { // THIS INDICATES THAT THE PROCESS MUST DIE. ANYTHING ELSE WILL 
    // CAUSE AN EXCEPTION CASCADE!!!
    What << " this process will be terminated";
    EXSystem_c(__LINE__, __FILE__, lError, What.str(),
      (EXCEPTION_NONCONTINUABLE) ? 
         EXBase_c::EXFatal : EXBase_c::EXError);
    terminate(); // AND NAIL THE PROCESS, SINCE NT SAYS 
                 // WE CAN'T GO ON.
  }
  throw EXSystem_c(__LINE__, __FILE__, lError, What.str(),
    (EXCEPTION_NONCONTINUABLE) ? 
       EXBase_c::EXFatal : EXBase_c::EXError);
}
//End of File