23.2 SEH之异常处理--《Windows核心编程》结构化异常处理
异常过滤程序的返回值:
EXCEPTION_EXECUTE_HANDLER 之 全局展开

#include<iostream>
#include<Windows.h>
using namespace std;
DWORD g_dwProtectData = 10;
void FuncRen1()
{
DWORD dwTemp = 0;
__try
{
__try
{
g_dwProtectData = 5 / dwTemp; // 除0,产生异常
}
__finally // 已经开始执行但未完成的带 finally 的 try 块
{
MessageBox(NULL, "This is finally", 0, NULL);
}
g_dwProtectData = 5 / 2; // 调试,不会被执行
}
__finally // 已经开始执行但未完成的带 finally 的 try 块
{
MessageBox(NULL, "This is finally 2", 0, NULL);
}
__try
{
g_dwProtectData = 5 / 3; // 除0,产生异常
}
__finally // 未开始执行但未完成的带 finally 的 try 块
{
MessageBox(NULL, "This is finally 3", 0, NULL); // 不会执行
}
}
int main()
{
__try
{
FuncRen1();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
MessageBox(NULL, "This is except", 0, NULL);
}
}



停止全局展开
#include<iostream>
#include<Windows.h>
using namespace std;
DWORD g_dwProtectData = 10;
void FuncRen1()
{
DWORD dwTemp = 0;
__try
{
g_dwProtectData = 5 / dwTemp; // 除0,产生异常
}
__finally // 已经开始执行但未完成的带 finally 的 try 块
{
return; // 停止全局展开,函数停止,控制权流回到上一个函数,
// 并让系统正常执行,就好像没有发生过异常一样
}
}
void Func1()
{
FuncRen1();
MessageBox(NULL, "Func1", "Warning", NULL); // 因为停止全局展开,控制权回到这里,会执行
}
int main()
{
__try
{
Func1();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
MessageBox(NULL, "This is except", "Warning", NULL); // 不会执行
// 停止全局展开...让系统正常执行,就好像没有发生过异常一样
}
}

EXCEPTION_CONTINUE_SEARCH(0):搜索更高层的except进行执行
#include<iostream>
#include<Windows.h>
#include <tchar.h>
using namespace std;
TCHAR g_szBuffer[100];
LONG OliFilter3(TCHAR **ppchBuffer)
{
if (*ppchBuffer == NULL)
{
*ppchBuffer = g_szBuffer; // ④修复之前pchBuffer = NULL的错误
return EXCEPTION_CONTINUE_EXECUTION; // ⑤继续执行异常位置
}
return EXCEPTION_EXECUTE_HANDLER; // ⑦第二次执行这个函数时,pchBuffer != NULL,此处被执行
}
void FuncAtude3(TCHAR *sz)
{
__try {
*sz = TEXT('\0'); // ① 未初始化指针,异常
// ⑥ 局部变量 sz 还是NULL,依然异常,再执行一次①~③
}
__except (EXCEPTION_CONTINUE_SEARCH) { // ②让系统在调用栈中向上找前一个带except的try代码块,并调用其异常过虑程序
// 这里永远不会被执行
}
}
void FunclinRoosevelt3()
{
TCHAR *pchBuffer = NULL;
__try
{
FuncAtude3(pchBuffer);
MessageBox(NULL, "This is FunclinRoosevelt3 before", "Warning", NULL);
}
__except(OliFilter3(&pchBuffer)) // ③由于 EXCEPTION_CONTINUE_SEARCH,这里被调用。
{
MessageBox(NULL, "This is FunclinRoosevelt3", "Warning", NULL); // ⑧ 执行
}
}
int main()
{
FunclinRoosevelt3();
}

GetExceptionCode
#include<iostream>
#include<Windows.h>
#include <tchar.h>
using namespace std;
void FunclinRoosevelt3()
{
__try {
int y = 0;
int x = 4 / y;
}
__except (
((GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) ||
(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO)) ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
switch (GetExceptionCode())
{
case EXCEPTION_ACCESS_VIOLATION:
MessageBox(NULL, "EXCEPTION_ACCESS_VIOLATION", 0, NULL);
break;
case EXCEPTION_INT_DIVIDE_BY_ZERO:
MessageBox(NULL, "EXCEPTION_INT_DIVIDE_BY_ZERO", 0, NULL); // 执行
break;
}
}
}
int main()
{
FunclinRoosevelt3();
}

GetExceptionInformation
- EXCEPTION_RECORD// 包含关于抛出异常的信息
- CONTEXT// 与异常和CPU相关的信息
- EXCEPTION_POINTERS// 含两个指针,指向前两个结构

EXCEPTION_RECORD SavedExceptRec; // 包含关于抛出异常的信息
CONTEXT SacedContext; // 与异常和CPU相关的信息
__try {
// ...
}
__except (
SavedExceptRec = *(GetExceptionInformation())->ExceptionRecord,
SacedContext = *(GetExceptionInformation())->ContextRecord,
EXCEPTION_EXECUTE_HANDLER) {
switch (SavedExceptRec.ExceptionCode)
{
// ...
}
}
软件异常
23.2 SEH之异常处理--《Windows核心编程》结构化异常处理的更多相关文章
- 深入研究 Win32 结构化异常处理(作者博客有许多SEH的研究文章)
摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...
- 深入研究 Win32 结构化异常处理(好多相关文章)
摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...
- Windows核心编程 第23章 结束处理程序
第2 3章 结束处理程序 SEH(结构化异常处理) 使用 S E H的好处就是当你编写程序时,只需要关注程序要完成的任务. 如果在运行时发生什么错误,系统会发现并将发生的问题通知你.利用S E H,你 ...
- 第23章 SEH结构化异常处理(1)_系统SEH机制
23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制: ...
- C++Windows核心编程读书笔记
转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...
- 【转】《windows核心编程》读书笔记
这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- 第23章 SEH结构化异常处理(2)_编译器对系统SEH机制的封装
23.2 编译器层面对系统SEH机制的封装 23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION (1)VC_EXCEPTIO ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
- 《Windows核心编程》读书笔记 上
[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
随机推荐
- 2、springboot创建多模块工程
系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...
- 《IT项目管理知识》出书了,特点:全是干货
大纲目录,及内容如下.本书属于付费内容
- 机器学习-线性分类-softmax回归 做多分类-10
1. softmax回归 伯努利分布(0-1分布 二分类),我们采用Logistic回归(用sigmoid函数映射到 0-1之间 输出预测概率)建模. 那么我们应该如何处理多分类问题?(比如要进行邮件 ...
- Linux复制安装 jdk 环境
转载请注明出处: 最近在弄服务器环境,发现可以通过复制已安装 jdk 的服务器配置到新的服务器,并配置服务器环境变量配置文件就可以完成. 操作步骤如下: 1. 查看以安装jdk服务器的环境配置,并复制 ...
- 01-UPF介绍
Mainstream Low Power techniques clock gating - 低功耗的设计风格,4bit以上可以通过综合工具增加ICG APR的时候可以更换器件VT Advanced ...
- P1047 [NOIP2005 普及组] 校门外的树
1.题目介绍 [NOIP2005 普及组] 校门外的树 题目描述 某校大门外长度为 \(l\) 的马路上有一排树,每两棵相邻的树之间的间隔都是 \(1\) 米.我们可以把马路看成一个数轴,马路的一端在 ...
- 通过 DBCA 创建 Oracle Database 21c 的进度停滞在 36%
1.问题 安装过程中一直卡在36% 检查 dbca 日志文件 位于 H:\app\trmbh\cfgtoollogs\dbca\ORCL\trace.log_2023-09-12_12-04-20PM ...
- 【转帖】JVM 内存模型与垃圾回收
文章目录 1. JVM内存模型 1.1. 程序计数器 (线程私有) 1.2. Java 虚拟机栈 (线程私有) 1.3. 本地方法栈 (线程私有) 1.4. Java 堆 (线程共享) 1.5. 方法 ...
- 【转帖】Linux 调优篇:虚拟化调优(hugepage 大页内存)* 叁
一. 大页(HugePages)概念Hugepage的引入二. hugepages相关概念三.Regular Pages 与 HugePagesa.Regular Pagesb.Huge Pages四 ...
- [转帖]Linux开发环境——SCL软件集
一.SCL简介 1.SCL简介 SCL(Software Collections)是一个CentOS/RHEL Linux平台的软件多版本共存解决方案,为RHEL/CentOS Linux用户提供一 ...