SEH and C++ Exceptions,自定义CSeException

Description of CSeException

CSeException class is based on CException class provided by MFC. I overwrite some of useful methods, but it is working same way like any other exception class based on CException class - you can find description in documentation provided by Visual C++.

By Martin Ziacek

Source Files :

[cpp] view plain copy

print?

  1. //////////////////////////////////////////////////////////////////////////
  2. // SeException.h    By Martin Ziacek
  3. #ifndef __SEEXCEPTION_H__
  4. #define __SEEXCEPTION_H__
  5. class CSeException : public CException
  6. {
  7. DECLARE_DYNAMIC(CSeException)
  8. public:
  9. CSeException(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers);
  10. CSeException(CSeException & CseExc);
  11. _EXCEPTION_POINTERS* GetSePointers(void);
  12. PVOID GetExceptionAddress(void);
  13. UINT GetSeCode(void);
  14. void Delete(void);
  15. int  ReportError(UINT nType = MB_OK, UINT nIDHelp = 0);
  16. BOOL GetErrorMessage(CString & CsErrDescr, PUINT pnHelpContext = NULL);
  17. BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);
  18. private:
  19. UINT                    m_nSeCode;
  20. _EXCEPTION_POINTERS*    m_pExcPointers;
  21. };
  22. void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers);
  23. #endif //__SEEXCEPTION_H__

[cpp] view plain copy

print?

  1. //////////////////////////////////////////////////////////////////////////
  2. // SeException.cpp  By Martin Ziacek
  3. #include "stdafx.h"
  4. #include "SeException.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #endif
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #define CASE(nSeCode,CsString) case EXCEPTION_##nSeCode: /
  11. CsString.Format(_T("Exception %s (0x%.8x) at address 0x%.8x."),_T(#nSeCode),EXCEPTION_##nSeCode,m_pExcPointers->ExceptionRecord->ExceptionAddress); /
  12. break;
  13. void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers)
  14. {
  15. throw new CSeException(nSeCode,pExcPointers);
  16. }
  17. IMPLEMENT_DYNAMIC(CSeException,CException)
  18. CSeException::CSeException(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers)
  19. {
  20. m_nSeCode = nSeCode;
  21. m_pExcPointers = pExcPointers;
  22. }
  23. CSeException::CSeException(CSeException & CseExc)
  24. {
  25. m_nSeCode = CseExc.m_nSeCode;
  26. m_pExcPointers = CseExc.m_pExcPointers;
  27. }
  28. UINT CSeException::GetSeCode()
  29. {
  30. return m_nSeCode;
  31. }
  32. _EXCEPTION_POINTERS* CSeException::GetSePointers()
  33. {
  34. return m_pExcPointers;
  35. }
  36. PVOID CSeException::GetExceptionAddress()
  37. {
  38. return m_pExcPointers->ExceptionRecord->ExceptionAddress;
  39. }
  40. void CSeException::Delete(void)
  41. {
  42. #ifdef _DEBUG
  43. m_bReadyForDelete = TRUE;
  44. #endif
  45. delete this;
  46. }
  47. int CSeException::ReportError(UINT nType/* = MB_OK*/, UINT nIDHelp/* = 0*/)
  48. {
  49. int rc;
  50. CString strMessage;
  51. GetErrorMessage(strMessage);
  52. rc = AfxMessageBox(strMessage,nType,nIDHelp);
  53. return rc;
  54. }
  55. BOOL CSeException::GetErrorMessage(CString & CsErrDescr, PUINT pnHelpContext/* = NULL*/)
  56. {
  57. BOOL rc = TRUE;
  58. if (pnHelpContext != NULL)
  59. *pnHelpContext = 0;
  60. switch (m_nSeCode)    {
  61. CASE(ACCESS_VIOLATION,CsErrDescr);
  62. CASE(DATATYPE_MISALIGNMENT,CsErrDescr);
  63. CASE(BREAKPOINT,CsErrDescr);
  64. CASE(SINGLE_STEP,CsErrDescr);
  65. CASE(ARRAY_BOUNDS_EXCEEDED,CsErrDescr);
  66. CASE(FLT_DENORMAL_OPERAND,CsErrDescr);
  67. CASE(FLT_DIVIDE_BY_ZERO,CsErrDescr);
  68. CASE(FLT_INEXACT_RESULT,CsErrDescr);
  69. CASE(FLT_INVALID_OPERATION,CsErrDescr);
  70. CASE(FLT_OVERFLOW,CsErrDescr);
  71. CASE(FLT_STACK_CHECK,CsErrDescr);
  72. CASE(FLT_UNDERFLOW,CsErrDescr);
  73. CASE(INT_DIVIDE_BY_ZERO,CsErrDescr);
  74. CASE(INT_OVERFLOW,CsErrDescr);
  75. CASE(PRIV_INSTRUCTION,CsErrDescr);
  76. CASE(IN_PAGE_ERROR,CsErrDescr);
  77. CASE(ILLEGAL_INSTRUCTION,CsErrDescr);
  78. CASE(NONCONTINUABLE_EXCEPTION,CsErrDescr);
  79. CASE(STACK_OVERFLOW,CsErrDescr);
  80. CASE(INVALID_DISPOSITION,CsErrDescr);
  81. CASE(GUARD_PAGE,CsErrDescr);
  82. CASE(INVALID_HANDLE,CsErrDescr);
  83. default:
  84. CsErrDescr = _T("Unknown exception.");
  85. rc = FALSE;
  86. break;
  87. }
  88. return rc;
  89. }
  90. BOOL CSeException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext/* = NULL*/)
  91. {
  92. ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));
  93. if (pnHelpContext != NULL)
  94. *pnHelpContext = 0;
  95. CString strMessage;
  96. GetErrorMessage(strMessage);
  97. if ((UINT)strMessage.GetLength() >= nMaxError) {
  98. lpszError[0] = 0;
  99. return FALSE;
  100. } else {
  101. lstrcpyn(lpszError, strMessage, nMaxError);
  102. return TRUE;
  103. }
  104. }

Demo Project:

[cpp] view plain copy

print?

  1. void CSehDemoDlg::OnBtnCreateException()
  2. {
  3. char *p = NULL;
  4. try
  5. {
  6. p[0] = 0;
  7. }
  8. catch(CSeException *e)
  9. {
  10. TCHAR trcMsg[1024];
  11. e->GetErrorMessage(trcMsg,1024);
  12. TRACE(trcMsg);
  13. TRACE(_T("/n"));
  14. e->ReportError(MB_OK | MB_ICONSTOP);
  15. e->Delete();
  16. }
  17. }

The Result:

From: http://www.codeproject.com/KB/cpp/seexception.aspx

http://blog.csdn.net/wangningyu/article/details/4579127

时间: 2024-11-08 03:15:00

SEH and C++ Exceptions,自定义CSeException的相关文章

第23章 SEH结构化异常处理(1)

23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制:SEH和VEH(WindowsXP以上新引进) (3)结构化异常处理(SEH)是Windows操作系统提供的强大异常处理功能.而Visual C++中的__try{} __finally{}和__try{} __except{}结构本质上是对Windows提供的SEH的封装. 23.1.2 SEH的

Asp.net MVC 自定义错误页面以及return HttpNotFound遇到的问题

今天在处理mvc 项目404和500页面时,发现我以前比较喜欢用的Return HttpNotFound()没有跳转到我在webconfig中配置的自定义404页面,而且也不会去执行Global中的Application_Error方法,经过一番查阅资料,发现这个问题得去想别的办法去做,具体的做法有三种,如下: 1.放弃Return HttpNotFound(),适用throw new HttpException(404, "page not found"); 2.让所有的Contro

Python Tutorial 学习(八)--Errors and Exceptions

8. Errors and Exceptions 错误与异常 此前,我们还没有开始着眼于错误信息.不过如果你是一路跟着例程走过来的,你就会发现一下错误信息.在Python里面至少有两类错误:语法错误和异常(syntax errors and exceptions) 8.1. Syntax Errors 语法错误 语法错误就是语法错误,语法错误就是语法错误. 比如说,关键词拼写错误,缩进错误,标点符号错误等等,比如下面这个栗子里面的在while循环的时候漏写了冒号引起的语法错误,注意错误提示中意既

SAP中自定义输出字段的ALV实例

这是运行的结果.对于我们的数据表我们需要字段可以自定义以ALV的格式输出. 特别注意点:wa_alv_field-fieldname = 'EMPID'.这个地方 EMPID一定要大写否则会在运行时报错. *&---------------------------------------------------------------------* *& Report  ZTBALV1 *& *&---------------------------------------

requests库之自定义request

阅读requests源码会有更清楚的理解. tcp/ip的三次握手,使用requests每次请求会占用更多资源,使用session则可以重复使用一个request. 自定义requests:首先定义session(proxy,timeout,verify--),定义request(body,headers,author--)然后用prepare方法进行包装,最后用session使用send方法发出请求. 实例: import json import requests from requests

注销凭证与自定义屏幕

注意注销凭证FB03    (事务代码SHDB) 自定义屏幕的功能代码与标准程序要对应一致 SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF } .L0S31 { font-style: italic; color: #808080 } .L0S32 { color: #3399FF } .L0S33 { color: #4DA619 } .L0S52 { co

Laravel之加密解密/日志/异常处理及自定义错误

一.加密解密 1.加密Crypt::encrypt($request->secret) 2.解密try { $decrypted = Crypt::decrypt($encryptedValue);} catch (DecryptException $e) { //} 二.日志 1.配置文件config/app.php 中的debug 配置选项控制浏览器显示的错误详情数量.默认情况下,该配置选项被设置在.env 文件中的环境变量APP_DEBUG .对本地开发而言,你应该设置环境变量APP_DE

Step by Step for configuration of sending customize IDOC/自定义IDOC发送配置

<div style="width: 600px; max-width: 100%; margin-bottom:5px;"><a href="https://docs.com/gan-gavin/6042/idoc-step-by-step-for-configuration-of-sending" title="自定义IDOC配置/Step by Step for configuration of sending customize

如何自定义一个NSOperation

Foundation framework提供了两个内置的NSOperation的子类,但是这两个内置的operation不一定能够满足我们的实际的需要.比如我们需要一个完成一个网络请求的operation,里面可能会有许多自定义的逻辑在里面,为了完成这些特有的逻辑,往往需要自定义一个NSOperation的子类来. NSOperation 类本身实现了许多与自定义有关的东西,我们只需要做相对较少的工作就可以了,自定义一个非并发的operation相对简单,只需要处理需要做的逻辑,并且处理canc