惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
Last Week in AI
Last Week in AI
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
H
Help Net Security
F
Fortinet All Blogs
MyScale Blog
MyScale Blog
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 司徒正美
量子位
N
Netflix TechBlog - Medium
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏
I
InfoQ
Microsoft Security Blog
Microsoft Security Blog
Scott Helme
Scott Helme
The Last Watchdog
The Last Watchdog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
AI
AI
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
Google Online Security Blog
Google Online Security Blog
U
Unit 42
V2EX - 技术
V2EX - 技术
MongoDB | Blog
MongoDB | Blog
Schneier on Security
Schneier on Security
博客园 - Franky
H
Heimdal Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
W
WeLiveSecurity
P
Privacy & Cybersecurity Law Blog
Cloudbric
Cloudbric
B
Blog RSS Feed
N
News | PayPal Newsroom
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园_首页
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
雷峰网
雷峰网

博客园 - 悠然小调

nothing.... Ogre中在SceneNode节点旁显示二维字的代码 博文阅读密码验证 - 博客园 最简单的智能指针原理 模板的特化 计算基类虚表指针在派生类中的偏移量 写一个内存拷贝函数 [转]来自 COM 经验的八个教训 COM本质论学习笔记(一)IDL winsock中select的作用 windows核心编程学习笔记(三)线程池(Thread Pooling) [转]亲密接触VC6.0编译器 windows核心编程学习笔记(七)DLL Injection and API Hooking windows核心编程学习笔记(五.续)堆 windows核心编程学习笔记(五)内存映射文件 windows核心编程学习笔记(四)windows内存结构/虚拟内存/线程的堆栈 windows核心编程学习笔记(二)Wait For Kernel Object(s) windows核心编程学习笔记(一)使用Critical Section [转]筛选法求素数
windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)
悠然小调 · 2008-03-04 · via 博客园 - 悠然小调

首先要要知道,结构化异常处理(SEH)和C++提供的异常处理不相同。

一.Termination Handlers
Termination Handlers使用很简单。在想使用SEH处理的地方使用
__try{/* [__leave;] */}
__finally{/* [AbnormalTermination] */}
即可。
SEH保证,无论__try中的代码怎样退出(正常执行完毕、retrun、goto、异常等等),都能保证__finally中的代码被执行。
1.在__try块之外的代码则没有这种特性。另外,TerminateThread或者TerminateProcess则使程序没有机会执行__finally里的代码;
2.如果__finally块中有return语句,那么将不会执行其他return语句;
3.因此应尽量少在__try块中放置return、goto等语句,在__finally语句中同样如此;
4.尽量使用__leave代替不可避免的return,__leave不会增加系统开销;
5.AbnormalTermination只用在__finally块中,如果是正常控制流进入__finally块,那么此函数返回FALSE,否则返回TRUE.

我们已经看到结束处理程序在补救t r y块中的过早退出的执行方面很有效,但也看到结束处理程序由于要阻止t r y块的过早退出而产生了我们不希望有的结果。更好的办法是在结束处理程序的t r y块中避免任何会引起过早退出的语句。实际上,最好将r e t u r n、c o n t i n u e、b r e a k、g o t o等语句从结束处理程序的t r y块和f i n a l l y块中移出去,放在结束处理程序的外面。这样做会使编译程序产生较小的代码,因为不需要再捕捉t r y块中的过早退出,也使编译程序产生更快的代码(因为执行局部展开的指令也少)。另外,代码也更容易阅读和维护。

二.Exception Handlers and Software Exceptions
__try{/* ... */}
__except(filter){/* ... */}

1.__except可以指定要过滤的条件,也可以是一个过滤函数。过滤函数返回3个异常之一;
2.与__finally不同的是,执行过__except块中的代码后,将继续执行该块之后的代码;
3.注意在与__except块配对的__try块中嵌套__finally时的情形(先执行所有__except块对应的__try块里的__finally,然后最终执行__except);
4.在__finally中写入return,可以阻止继续执行__except;
5.如果过滤函数返回EXCEPTION_CONTINUE_EXECTION,那么将不执行__except中的代码,而是返回到出现异常的代码,重新执行本条代码;
6.如果fliter是EXCEPTION_CONTINUE_SEARCH,那么本__except不处理该异常,继续像上层查找。如果所有的__except都没有处理EXCEPTION_EXECUTE_HANDLER,那么最终系统将调用UnhandledExceptionFilter,用来显示未处理异常的对话框,并让用户选择是否调试等等。如果用户选择了调试,那么UnhandledExceptionFilter就运行调试器进程,并附加本进程id作为参数,调试开始了;
7.fliter中可以通过GetExceptionCode获取异常的代码,这很有用滴.PS:不能再过滤函数里调用此函数哦;
8.可以通过调用GetExceptionInformation()能获取更详细的异常时信息,比如寄存器等等,同样,也只能在filter中调用;
9.通过调用RaiseException来触发一个软件异常。

三.C++异常和结构化异常
在VC++中,如果你使用了C++的try、catch等等,会自动被转化为SEH。例如,throw被转化为RaiseException,而catch则是__except。