1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
class SException : public std::exception {
public :
SException(UINT nSeCode, _EXCEPTION_POINTERS *pExcPointers);
virtual const char* what() const throw();
private:
static char sBuffer[256];
};
#define CASE(nSeCode) case EXCEPTION_##nSeCode: sprintf_s(sBuffer, 256, "Exception %s (0x%.8x) at address 0x%p.", #nSeCode, EXCEPTION_##nSeCode, pExcPointers->ExceptionRecord->ExceptionAddress); break;
const char *SException::what() const throw() {
return sBuffer;
}
SException::SException(UINT nSeCode, _EXCEPTION_POINTERS *pExcPointers) {
switch (nSeCode) {
CASE(ACCESS_VIOLATION)
CASE(DATATYPE_MISALIGNMENT)
CASE(BREAKPOINT)
CASE(SINGLE_STEP)
CASE(ARRAY_BOUNDS_EXCEEDED)
CASE(FLT_DENORMAL_OPERAND)
CASE(FLT_DIVIDE_BY_ZERO)
CASE(FLT_INEXACT_RESULT)
CASE(FLT_INVALID_OPERATION)
CASE(FLT_OVERFLOW)
CASE(FLT_STACK_CHECK)
CASE(FLT_UNDERFLOW)
CASE(INT_DIVIDE_BY_ZERO)
CASE(INT_OVERFLOW)
CASE(PRIV_INSTRUCTION)
CASE(IN_PAGE_ERROR)
CASE(ILLEGAL_INSTRUCTION)
CASE(NONCONTINUABLE_EXCEPTION)
CASE(STACK_OVERFLOW)
CASE(INVALID_DISPOSITION)
CASE(GUARD_PAGE)
CASE(INVALID_HANDLE)
default:
sprintf_s(sBuffer, 256, "Unknown exception.");
break;
}
m_Message = sBuffer;
}
void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers) {
throw SException(nSeCode, pExcPointers);
} |
Partager