123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #include "StdAfx.h"
- #include <exception>
- 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_;
- }
|