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版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
随机推荐
- MaxListenersExceededWarning:Possible EventEmitter memory leak detected.
打包出现内存溢出 解决办法:
- [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event.
在基于 Element-ui 写项目的时候,Chrome 提醒: [Violation] Added non-passive event listener to a scroll-blocking ' ...
- 黑池舞蹈节banner
- 手把手实践教你删除项目当中无用的npm包
在公司中,我们大部分都是多人共同开发和长时间维护一个项目,但是有时候我们会发现有很多已经废弃的npm 包存在 package.json 中,我们想要删除,但是又不能盲目的删除?那么 depcheck ...
- C语言基础之第一个C程序
前言 在开始学习 C 语言的基础知识之前,我们需要学习如何编写.编译和运行第一个 C 程序. 要编写第一个 C 程序,打开 C 控制台并编写以下代码,我这里直接使用vs2022进行代码的编写: #in ...
- maven开源仓库
在公司开发一般都用公司内部的maven仓库,但回家之后,就访问不了公司的网络,使用不了公司的maven仓库,只能使用开源的maven仓库. 在网上搜索和整理了几个比较好用的maven开源镜像仓库,记录 ...
- 15-Verilog Coding Style
Verilog Coding Style 1.为什么需要Coding Style 可综合性 - 代码需要综合成网表,如果写了一些不可综合的代码,会出现错误 可读性,代码通常有多个版本,所以需要保证代码 ...
- 【ThreadX-USBX】Azure RTOS USBX概述
Azure RTOS USBX是高性能USB主机,设备和移动(OTG)嵌入式堆栈.Azure RTOS USBX与Azure RTOS ThreadX完全集成,并且可用于所有ThreadX支持的处理器 ...
- MySQL复习——20211027
MYSQL MySQL创建数据库 我们可以在登录MySQL服务后,使用create命令创建数据库,语法如下: CREATE DATABASE 数据库名; 使用root用户登录,root用户拥有最高权限 ...
- 海思Hi35xx 通过uboot查看flash指定地址的数据
前言 在实际应用中有遇到过设备放置一段时间后设备不能启动的问题,uboot 完全没有响应,类似于flash中的数据被擦洗掉一样. 网上有介绍说是nandflash 不稳定,高温或是静电会导致nan ...