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版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
随机推荐
- C#实现斐波拉切数列求和
C#实现斐波拉切数列求和 private void button1_Click(object sender, EventArgs e) { listBox1.Items.Clear();//清空Lis ...
- 解决JedisNoReachableClusterNodeException,No reachable node in cluster报错
通过jedis连接redis集群时报如下的错误:JedisNoReachableClusterNodeException,No reachable node in cluster 本机连接均正常: ...
- FIFO设计
first in first out,先进先出 fifo是基于RAM进行设计的 双端口RAM设计(16*8) 如果大的RAM可以调用IP RAM的关键参数:深度和宽度 module dual_ram ...
- c#下使用WM_COPYDATA
[DllImport("User32.dll")] public static extern int SendMessage(IntPtr hwnd, int msg, int w ...
- SpringMVC05——SSM整合
整合SSM 需求:熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识 CREATE DATABASE `ssmbuild`; USE `ssmbuild`; D ...
- Shell-全局变量-export
- 今天是个好日子,TaxCore(POS软件)备案指北
POS软件是什么?你好意思吗,还在用老掉牙的Winform. 关于POS 销售终端--POS(point of sale)是一种多功能终端,把它安装在信用卡的特约商户和受理网点中与计算机联成网络,就能 ...
- [转帖]db file sequential read-数据文件顺序读取
https://www.cnblogs.com/xibuhaohao/p/9959593.html 等待事件: "db file sequential read" Referenc ...
- [转帖]linux删除文本文件空白行
linux删除文本文件空白行https://www.zhihu.com/people/chen-kai-84-54-75 sed命令 在Linux中,可以使用sed命令批量删除文本中的空白行.以下是一 ...
- 【转帖】千亿参数大模型首次被撬开!Meta复刻GPT-3“背刺”OpenAI,完整模型权重及训练代码全公布
https://cloud.tencent.com/developer/article/1991011 千亿级参数AI大模型,竟然真的能获取代码了?! 一觉醒来,AI圈发生了一件轰动的事情-- Met ...