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. xml、xhtml、html、dhtml的区别

    1.XML 可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 可扩展标记语言可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内 ...

  2. RabbitMQ 原文译05--Topics

    在之前的系统中,我们改进了我们的日志系统,我们使用direct 交换机代替fanout交换机,可以实现选择性的接受日志. 虽然使用direct 交换机改进了我们的系统,但是对于多种条件的判断,依然存在 ...

  3. 20160329javaweb之JSP -cookie入门

    一.什么是会话? •会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话过程中要解决的一些问题? •每个用户在使用浏览器与服务器 ...

  4. VS2015 Cordova Ionic移动开发(一)

    一.Windows环境配置 1.如果已经安装VS2015,打开[工具]-[选项]找到Cordova选项: 运行依赖关系查看器,用来检测开发环境是否完整. 如果检测显示: 那么就是环境配置完成了.可以直 ...

  5. html-----011--子窗体iframe

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. EntityClient 介绍

    System.Data.EntityClient 命名空间是 实体框架的 .NET Framework 数据提供程序.EntityClient 提供程序使用存储特定的 ADO.NET 数据提供程序类和 ...

  7. IIS原理学习

    IIS 原理学习 首先声明以下内容是我在网上搜索后整理的,在此只是进行记录,以备往后查阅只用. IIS 5.x介绍 IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Appl ...

  8. Fedora 17 修改GRUB启动菜单顺序

    Fedora 16采用GRUB2,因此启动菜单编辑方式与以前版本有所不同 设置默认启动Windows 1. 首先找到Windows的menuentry # cat   /boot/grub2/grub ...

  9. 那些所谓过滤掉iOS菜鸟的面试题

    一.struct和class的区别<swfit里的array是什么类型,在大量复制时会不会有性能问题.> class是引用类型,struct是值类型 class可以继承类.接口和被继承,s ...

  10. PhoneGap与WAP站静态化

    最近在参与的WAP站项目,决定将所有页面都静态化处理,登录验证.价格数据等都通ajax动态的方式实现.开始这么规划的目前是为了页面提高网站加载速度及SEO,最近看到了一篇报道phonegap buil ...