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 :

  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__
  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:

  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

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

  1. Vue学习笔记-Django REST framework3后端接口API学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  2. HttpRunner3源码阅读:4. loader项目路径加载,用例文件转换、方法字典生成

    loader.py 这个文件中主要是对yaml,json用例加载转换成用例处理, 预置函数加载成方法字典,路径加载等 可用资料 [importlib]. https://docs.python.org ...

  3. Django 自定义模板标签 报错django.template.exceptions.TemplateSyntaxError: '####' is not a registered tag library. Must be one of:

    我写代码遇到这个错误,但是发现程序没有写错,好像是程序有缓存,重新运行几次就好了. 自定义模板标签,可以不用写views,url直接通过自定义函数把变量传给模板. 具体实现: 1.在app下新建Pyt ...

  4. Asp.Net 自定义储存Session方式

    介绍 由于针对于自定义Session存储方式比较少,所以整理了使用自定义Session的方式.用于构建自定义会话存储提供程序代码,而不是使用默认的 SessionStore 介绍 背景 本文使用的是m ...

  5. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  6. 第25章 SEH结构化异常处理_未处理异常及向量化异常

    25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID ...

  7. 第23章 SEH结构化异常处理(1)_系统SEH机制

    23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制: ...

  8. CAS自定义登录验证方法

    一.CAS登录认证原理 CAS认证流程如下图: CAS服务器的org.jasig.cas.authentication.AuthenticationManager负责基于提供的凭证信息进行用户认证.与 ...

  9. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

随机推荐

  1. Modelsim覆盖率

    步骤: 1.compile选项 => compile options  Covrage setting  (或者可以点击选中文件,编辑properties,在coverage中选择要实现的覆盖选 ...

  2. (转)asp.net 高质量缩略图

    原文地址:http://www.cnblogs.com/Fooo/archive/2009/06/19/1506381.html using System.Drawing; ------------- ...

  3. 新增的html5中js获取方法

    一.querySelector   获取的选择器与jquery的选择器相同

  4. 参加魅族 flyme 互联网编程大赛的一些感受

    为期两天的 flyme 编程大赛已经结束了,自己也在这次大赛中深有感触,受益颇丰. 在这次大赛里,认识到了很多厉害的开发者,有单打独斗的,也有四五成群的.开幕致辞上看到很多非常有创意的点子,感觉每个队 ...

  5. html调用applet

    1.相同目录下 <applet code="*.class" width=250 height=50> </applet> 指定applet类名称,appl ...

  6. mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法

    补充:正常情况下,建议数据库备份最好用工具进行备份,通过拷贝数据库表进行数据迁移,不同的环境会出现各种不同的意外问题. 背景:今天在整理一个网站的时候,操作系统由于系统自动更新导致一直出现系统蓝屏死机 ...

  7. Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法

    Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法 Ext.Net GridPanel可以进行Group操作,例如: 如何启用Grouping功能呢?只需要在Grid ...

  8. Quartz2.2.1操作手册

    一.初识quartz JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1") ...

  9. linux管道学习(一)

    最近学习了管道 pipe,在这里进行一下总结. 这里贴一段自己的实做代码 struct node{ int a; long b; }; int main() { ]; pid_t pid; ]; in ...

  10. centOS tengine 安装后 不能访问的问题

    1 安装方式跟在ubuntu下 安装一样.因为都是用源码 2  但安装好以后发现,局域网电脑访问不了!.原以为是安装错了.又装了一遍,还是不行,最终是iptables 没开放80端口... http: ...