structured_exception.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "StdAfx.h"
  2. #include <exception>
  3. using namespace std;
  4. #include "structured_exception.h"
  5. #include "windows.h"
  6. static void my_translator(unsigned code, EXCEPTION_POINTERS *info)
  7. {
  8. throw structured_exception(*info);
  9. }
  10. //
  11. // structured_exception::
  12. //
  13. structured_exception::structured_exception(EXCEPTION_POINTERS const &info) throw()
  14. {
  15. EXCEPTION_RECORD const &exception = *(info.ExceptionRecord);
  16. address_ = exception.ExceptionAddress;
  17. code_ = exception.ExceptionCode;
  18. }
  19. void structured_exception::install() throw()
  20. {
  21. _set_se_translator(my_translator);
  22. }
  23. char const *structured_exception::what() const throw()
  24. {
  25. switch(code_)
  26. {
  27. case EXCEPTION_ACCESS_VIOLATION:
  28. return (char *)_T("Access Violation");
  29. break;
  30. case EXCEPTION_DATATYPE_MISALIGNMENT:
  31. return (char *)_T("Datatype Misalignment");
  32. break;
  33. case EXCEPTION_BREAKPOINT:
  34. return (char *)_T("Breakpoint");
  35. break;
  36. case EXCEPTION_SINGLE_STEP:
  37. return (char *)_T("Single Step");
  38. break;
  39. case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
  40. return (char *)_T("Array Bounds Exceeded");
  41. break;
  42. case EXCEPTION_FLT_DENORMAL_OPERAND:
  43. return (char *)_T("Flt Denormal Operand");
  44. break;
  45. case EXCEPTION_FLT_DIVIDE_BY_ZERO:
  46. return (char *)_T("Flt Divid by Zero");
  47. break;
  48. case EXCEPTION_FLT_INEXACT_RESULT:
  49. return (char *)_T("Flt Inexact Result");
  50. break;
  51. case EXCEPTION_FLT_INVALID_OPERATION:
  52. return (char *)_T("Flt Invalid Operation");
  53. break;
  54. case EXCEPTION_FLT_OVERFLOW:
  55. return (char *)_T("Flt Overflow");
  56. break;
  57. case EXCEPTION_FLT_STACK_CHECK:
  58. return (char *)_T("Flt Stack Check");
  59. break;
  60. case EXCEPTION_FLT_UNDERFLOW:
  61. return (char *)_T("Flt Underflow");
  62. break;
  63. case EXCEPTION_INT_DIVIDE_BY_ZERO:
  64. return (char *)_T("Int Divid by Zero");
  65. break;
  66. case EXCEPTION_INT_OVERFLOW:
  67. return (char *)_T("Int Underflow");
  68. break;
  69. case EXCEPTION_PRIV_INSTRUCTION:
  70. return (char *)_T("Priv Instruction");
  71. break;
  72. case EXCEPTION_IN_PAGE_ERROR:
  73. return (char *)_T("In Page Error");
  74. break;
  75. case EXCEPTION_ILLEGAL_INSTRUCTION:
  76. return (char *)_T("Illegal Instruction");
  77. break;
  78. case EXCEPTION_NONCONTINUABLE_EXCEPTION:
  79. return (char *)_T("Noncontinuable Exception");
  80. break;
  81. case EXCEPTION_STACK_OVERFLOW:
  82. return (char *)_T("Stack Overflow");
  83. break;
  84. case EXCEPTION_INVALID_DISPOSITION:
  85. return (char *)_T("Invalid Disposition");
  86. break;
  87. case EXCEPTION_GUARD_PAGE:
  88. return (char *)_T("Guard Page");
  89. break;
  90. case EXCEPTION_INVALID_HANDLE:
  91. return (char *)_T("Invalid Handle");
  92. break;
  93. default:
  94. return (char *)_T("unspecified Structured Exception");
  95. break;
  96. }
  97. }
  98. void const *structured_exception::where() const throw()
  99. {
  100. return address_;
  101. }