#include "StdAfx.h" #include using namespace std; #include "structured_exception.h" #include "windows.h" static void my_translator(unsigned code, EXCEPTION_POINTERS *info) { throw structured_exception(*info); } // // structured_exception:: // structured_exception::structured_exception(EXCEPTION_POINTERS const &info) throw() { EXCEPTION_RECORD const &exception = *(info.ExceptionRecord); address_ = exception.ExceptionAddress; code_ = exception.ExceptionCode; } void structured_exception::install() throw() { _set_se_translator(my_translator); } char const *structured_exception::what() const throw() { switch(code_) { case EXCEPTION_ACCESS_VIOLATION: return (char *)_T("Access Violation"); break; case EXCEPTION_DATATYPE_MISALIGNMENT: return (char *)_T("Datatype Misalignment"); break; case EXCEPTION_BREAKPOINT: return (char *)_T("Breakpoint"); break; case EXCEPTION_SINGLE_STEP: return (char *)_T("Single Step"); break; case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: return (char *)_T("Array Bounds Exceeded"); break; case EXCEPTION_FLT_DENORMAL_OPERAND: return (char *)_T("Flt Denormal Operand"); break; case EXCEPTION_FLT_DIVIDE_BY_ZERO: return (char *)_T("Flt Divid by Zero"); break; case EXCEPTION_FLT_INEXACT_RESULT: return (char *)_T("Flt Inexact Result"); break; case EXCEPTION_FLT_INVALID_OPERATION: return (char *)_T("Flt Invalid Operation"); break; case EXCEPTION_FLT_OVERFLOW: return (char *)_T("Flt Overflow"); break; case EXCEPTION_FLT_STACK_CHECK: return (char *)_T("Flt Stack Check"); break; case EXCEPTION_FLT_UNDERFLOW: return (char *)_T("Flt Underflow"); break; case EXCEPTION_INT_DIVIDE_BY_ZERO: return (char *)_T("Int Divid by Zero"); break; case EXCEPTION_INT_OVERFLOW: return (char *)_T("Int Underflow"); break; case EXCEPTION_PRIV_INSTRUCTION: return (char *)_T("Priv Instruction"); break; case EXCEPTION_IN_PAGE_ERROR: return (char *)_T("In Page Error"); break; case EXCEPTION_ILLEGAL_INSTRUCTION: return (char *)_T("Illegal Instruction"); break; case EXCEPTION_NONCONTINUABLE_EXCEPTION: return (char *)_T("Noncontinuable Exception"); break; case EXCEPTION_STACK_OVERFLOW: return (char *)_T("Stack Overflow"); break; case EXCEPTION_INVALID_DISPOSITION: return (char *)_T("Invalid Disposition"); break; case EXCEPTION_GUARD_PAGE: return (char *)_T("Guard Page"); break; case EXCEPTION_INVALID_HANDLE: return (char *)_T("Invalid Handle"); break; default: return (char *)_T("unspecified Structured Exception"); break; } } void const *structured_exception::where() const throw() { return address_; }