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++.
Source Files :
- //////////////////////////////////////////////////////////////////////////
- // SeException.h By Martin Ziacek
- #ifndef __SEEXCEPTION_H__
- #define __SEEXCEPTION_H__
- class CSeException : public CException
- {
- DECLARE_DYNAMIC(CSeException)
- public:
- CSeException(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers);
- CSeException(CSeException & CseExc);
- _EXCEPTION_POINTERS* GetSePointers(void);
- PVOID GetExceptionAddress(void);
- UINT GetSeCode(void);
- void Delete(void);
- int ReportError(UINT nType = MB_OK, UINT nIDHelp = 0);
- BOOL GetErrorMessage(CString & CsErrDescr, PUINT pnHelpContext = NULL);
- BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);
- private:
- UINT m_nSeCode;
- _EXCEPTION_POINTERS* m_pExcPointers;
- };
- void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers);
- #endif //__SEEXCEPTION_H__
- //////////////////////////////////////////////////////////////////////////
- // SeException.cpp By Martin Ziacek
- #include "stdafx.h"
- #include "SeException.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #define CASE(nSeCode,CsString) case EXCEPTION_##nSeCode: /
- CsString.Format(_T("Exception %s (0x%.8x) at address 0x%.8x."),_T(#nSeCode),EXCEPTION_##nSeCode,m_pExcPointers->ExceptionRecord->ExceptionAddress); /
- break;
- void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers)
- {
- throw new CSeException(nSeCode,pExcPointers);
- }
- IMPLEMENT_DYNAMIC(CSeException,CException)
- CSeException::CSeException(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers)
- {
- m_nSeCode = nSeCode;
- m_pExcPointers = pExcPointers;
- }
- CSeException::CSeException(CSeException & CseExc)
- {
- m_nSeCode = CseExc.m_nSeCode;
- m_pExcPointers = CseExc.m_pExcPointers;
- }
- UINT CSeException::GetSeCode()
- {
- return m_nSeCode;
- }
- _EXCEPTION_POINTERS* CSeException::GetSePointers()
- {
- return m_pExcPointers;
- }
- PVOID CSeException::GetExceptionAddress()
- {
- return m_pExcPointers->ExceptionRecord->ExceptionAddress;
- }
- void CSeException::Delete(void)
- {
- #ifdef _DEBUG
- m_bReadyForDelete = TRUE;
- #endif
- delete this;
- }
- int CSeException::ReportError(UINT nType/* = MB_OK*/, UINT nIDHelp/* = 0*/)
- {
- int rc;
- CString strMessage;
- GetErrorMessage(strMessage);
- rc = AfxMessageBox(strMessage,nType,nIDHelp);
- return rc;
- }
- BOOL CSeException::GetErrorMessage(CString & CsErrDescr, PUINT pnHelpContext/* = NULL*/)
- {
- BOOL rc = TRUE;
- if (pnHelpContext != NULL)
- *pnHelpContext = 0;
- switch (m_nSeCode) {
- CASE(ACCESS_VIOLATION,CsErrDescr);
- CASE(DATATYPE_MISALIGNMENT,CsErrDescr);
- CASE(BREAKPOINT,CsErrDescr);
- CASE(SINGLE_STEP,CsErrDescr);
- CASE(ARRAY_BOUNDS_EXCEEDED,CsErrDescr);
- CASE(FLT_DENORMAL_OPERAND,CsErrDescr);
- CASE(FLT_DIVIDE_BY_ZERO,CsErrDescr);
- CASE(FLT_INEXACT_RESULT,CsErrDescr);
- CASE(FLT_INVALID_OPERATION,CsErrDescr);
- CASE(FLT_OVERFLOW,CsErrDescr);
- CASE(FLT_STACK_CHECK,CsErrDescr);
- CASE(FLT_UNDERFLOW,CsErrDescr);
- CASE(INT_DIVIDE_BY_ZERO,CsErrDescr);
- CASE(INT_OVERFLOW,CsErrDescr);
- CASE(PRIV_INSTRUCTION,CsErrDescr);
- CASE(IN_PAGE_ERROR,CsErrDescr);
- CASE(ILLEGAL_INSTRUCTION,CsErrDescr);
- CASE(NONCONTINUABLE_EXCEPTION,CsErrDescr);
- CASE(STACK_OVERFLOW,CsErrDescr);
- CASE(INVALID_DISPOSITION,CsErrDescr);
- CASE(GUARD_PAGE,CsErrDescr);
- CASE(INVALID_HANDLE,CsErrDescr);
- default:
- CsErrDescr = _T("Unknown exception.");
- rc = FALSE;
- break;
- }
- return rc;
- }
- BOOL CSeException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext/* = NULL*/)
- {
- ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));
- if (pnHelpContext != NULL)
- *pnHelpContext = 0;
- CString strMessage;
- GetErrorMessage(strMessage);
- if ((UINT)strMessage.GetLength() >= nMaxError) {
- lpszError[0] = 0;
- return FALSE;
- } else {
- lstrcpyn(lpszError, strMessage, nMaxError);
- return TRUE;
- }
- }
Demo Project:
- void CSehDemoDlg::OnBtnCreateException()
- {
- char *p = NULL;
- try
- {
- p[0] = 0;
- }
- catch(CSeException *e)
- {
- TCHAR trcMsg[1024];
- e->GetErrorMessage(trcMsg,1024);
- TRACE(trcMsg);
- TRACE(_T("/n"));
- e->ReportError(MB_OK | MB_ICONSTOP);
- e->Delete();
- }
- }
The Result:

From: http://www.codeproject.com/KB/cpp/seexception.aspx
http://blog.csdn.net/wangningyu/article/details/4579127
SEH and C++ Exceptions,自定义CSeException的更多相关文章
- Vue学习笔记-Django REST framework3后端接口API学习
一 使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7 (Windows x86- ...
- HttpRunner3源码阅读:4. loader项目路径加载,用例文件转换、方法字典生成
loader.py 这个文件中主要是对yaml,json用例加载转换成用例处理, 预置函数加载成方法字典,路径加载等 可用资料 [importlib]. https://docs.python.org ...
- Django 自定义模板标签 报错django.template.exceptions.TemplateSyntaxError: '####' is not a registered tag library. Must be one of:
我写代码遇到这个错误,但是发现程序没有写错,好像是程序有缓存,重新运行几次就好了. 自定义模板标签,可以不用写views,url直接通过自定义函数把变量传给模板. 具体实现: 1.在app下新建Pyt ...
- Asp.Net 自定义储存Session方式
介绍 由于针对于自定义Session存储方式比较少,所以整理了使用自定义Session的方式.用于构建自定义会话存储提供程序代码,而不是使用默认的 SessionStore 介绍 背景 本文使用的是m ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
- 第25章 SEH结构化异常处理_未处理异常及向量化异常
25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID ...
- 第23章 SEH结构化异常处理(1)_系统SEH机制
23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制: ...
- CAS自定义登录验证方法
一.CAS登录认证原理 CAS认证流程如下图: CAS服务器的org.jasig.cas.authentication.AuthenticationManager负责基于提供的凭证信息进行用户认证.与 ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
随机推荐
- A swift Tour(2) Control Flow
Control Flow 用 if 和 switch 来做条件语句,并且用for-in,for,while,和do-while做循环,条件和循环的括号是可以不写的,但是body外面的括号是必须写的 l ...
- ACM/ICPC ZOJ1003-Crashing Balloon 解题代码
#include <iostream> using namespace std; int main() { int **array = new int *[100]; for ( int ...
- Java—static、this、super用法总结
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.(理解为加了static的就是全局变量)但是,并不是说有了这种便利,你便可 ...
- mysql分区功能详细介绍,以及实例
一,什么是数据库分区 前段时间写过一篇关于mysql分表的 的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下 ...
- OC - 8.Quartz2D核心要点
简介 作用 绘制 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件(通常为内部结构较复杂的控件) UIKit中的绝大部分控 ...
- 命令行下上传文件到iOS软件 专业文件管理/gplayer
U盘丢了, 就拿手机当U盘用用先. 一般情况下软件打开上传功能, 在浏览器里上传即可. 可是偏偏我的电影放在了 树莓派里面(搭建了一个SMB), 直接浏览器的话,会多占用些带宽, 我的破路由器.... ...
- groovy --不注意的小错误(java.lang.String.positive() is applicable)
sql 语句拼接报错: No signature of method: java.lang.String.positive() is applicable for argument types: () ...
- ASP.NET一些常用的东西
三层架构的命名: UI: User Interface (数据显示层 用户界面)BLL:Business Logic Layer (业务逻辑层)DAL:Data Access Layer (数据访问层 ...
- 微软AJAX解决方案
-------- 微软AJAX解决方案 (*) --------ASP.Net中内置的简化AJAX开发的控件UpdatePanel 放入ScriptManager,将要实现AJAX效果的控件放到Upd ...
- Jquery 动态生成表单 并将表单数据 批量通过Ajax插入到数据库
利用Jquery 动态生成 Table 表单 之后利用each 方法来遍历所有文本框获取文本的value值 并通过Ajax 将数据 提交到Web服务里把数据插入数据库 Html页面 <!DOC ...