在C++中使用try/catch不能捕捉操作系统抛出的异常,如非法地址访问、浮点异常等,而使用VC中的扩展特性__try/__except和__try/__finally可以捕捉这类异常.如:
int Func(int i)
{
int z=0;
__try{
//throw std::exception("manual error");
i = i/z;
}
__except(EXCEPTION_EXECUTE_HANDLER){
throw system_error(GetExceptionCode());
}
return i;
}
void main(void)
{
int i=3;
try{
Func(i);
}
catch(const system_error& ex){
cout }
catch(const std::exception& ex){
cout }
}
上例中捕捉到系统异常后组装成C++的异常,然后重新抛出,这样在上层的代码中就可以使用标准的C++异常机制进行处理,但该特性只能在WINDOWS中使用。
这种方式队了对操作系统的依赖性,还有一些限制,(1)在同一个函数中不能与C++标准的try/catch同时使用(2)在__except块中不能有需要调用析构函数的代码,即不可以在其中进行对象的创建与销毁;(3)它会捕捉所有的异常,包括C++可以捕捉的异常,我试图使用如下方法将其分离,但在VS2008中重新抛出异常后VS就不动弹了,不知何故,理论上好像没有问题啊?!.
int Func(int i)
{
int z=0;
__try{
throw std::exception("manual error");
i = i/z;
}
__except(EXCEPTION_EXECUTE_HANDLER){
if(3765269347 == GetExceptionCode()){
throw; // 重新抛出C++的标准异常
}
else throw system_error(GetExceptionCode());
}
return i;
}
__except的三种方式处理方式:
EXCEPTION_EXECUTE_HANDLER 执行__except程序块
EXCEPTION_CONTINUE_SEARCH 系统忽略该异常处理器并在封装的代码中继续寻找直到发现一个异常处理器。
EXCEPTION_CONTINUE_EXECUTION 系统立即归还控制权给异常发生的地方。
使用filter函数可以对__except处理方式进行过滤,如:
#include <float.h><br>DWORD exception_filter(DWORD excode) <br>{ <br> switch(excode){ <br>case EXCEPTION_INT_DIVIDE_BY_ZERO: <br> return EXCEPTION_EXECUTE_HANDLER; <br>default: <br> return EXCEPTION_CONTINUE_SEARCH; <br> } </float.h>
}
int Func(int i)
{
int z=0;
__try{
throw std::exception("manual error");
i = i/z;
}
__except(exception_filter(GetExceptionCode())){
throw system_error(GetExceptionCode());
}
return i;
}
这里对于EXCEPTION_INT_DIVIDE_BY_ZERO之外异常,使用了EXCEPTION_CONTINUE_SEARCH的方式,而被main中的catch(const std::exception& ex)捕获,这样便可以实现对系统异常及C++可以捕获的异常进行分离。
这种方式,可用于底层类的编写,过滤掉系统级的异常,减少程序崩溃的可能性,将C++可以捕获的异常传递到上层,供上层统一处理。
要获得理详细的信息,需要使用GetExceptionInformation( )函数。
分享到:
相关推荐
windows系统程序设计之结构化异常处理
精心搜集的关于windows下的C/C++异常处理机制的描述,语言简单易懂。适合初学者。打好基础才能更好地发展。
Linux下实现Windows的结构化异常处理.pdf
导论 相比较其他传统的语言,C++的一个变革的特征是支持异常处理。相对于传统语言的不清楚容易错误的错误处理机制,C++的异常处理是一个非常好的替代。...SHE是windows操作系统提供的结构化的异常处理。
在本文的讨论中,我认为异常或者是被明确的抛出的,或者是由于除零溢出、空指针访问等引起的。当它发生时会产生一个...Windows定义了结构“EXCEPTION_REGISTRATION”,使我们能够向操作系统注册自己的异常处理程序。
网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据...
首先从系统层面和编译层面分析了Windows和C++异常处理的基本原理,指出了基于 Windows的C++异常处理机制在使用过程中可能出现的逻辑错误,以及Windows运行时库中个别函数可能存在的此类安全隐患。为了更好地保证C++...
■ Windows系统之父Jim Allchin亲自撰文推荐! ■ Windows NT首席设计师David N. Cutler亲自撰文推荐! ■ 深入解析Windows操作系统!彻底揭开Windows技术内幕! ■ Csdn、博客堂、博客园、《程序员》杂志鼎力推荐!...
svchost.exe[1348]中发生未处理的win32异常 这是一个远程代码执行漏洞。成功利用此漏洞的攻击者会完全远程控制受影响的系统
篇一:Windows服务器巡检 Windows系统健康检查 一、服务器巡检的重要性 windows服务器是系统重要的业务运行平台,对服务器进行巡检能够及时发现服务器的隐患,以便于改善和优化服务器的性能;观察服务器的运行状况,及时...
Microsoft Windows 系统错误代码简单分析: 0000 操作已成功完成。 0001 错误的函数。 0002 系统找不到指定的文件。 0003 系统找不到指定的路径。 0004 系统无法打开文件。 0005 拒绝访问。...
深入解析windows 操作系统第6版第2-3章.Russinovich.范德成.中文.扫描 内容目录 第2章系统架构 33 2.1 需求和设计目标 33 2.2 操作系统模型 34 2.3 总体架构 35 可移植性 37 对称多处理 38 可伸缩性 40 客户...
系统里面有时侯出现超长路径无法删除里面的文件的解决办法.
利用SQL Server建立后台数据库和以面向对象的Delphi语言作为应用程序开发工具,在Windows 2000平台上开发了图形用户界面的重力异常数据处理系统。该系统集重力异常数据处理和数据库管理为一体,包括了数据输入、数据...
使用JMeter压测时,报java.net.bindexception:address already is use:connect异常,可执行本资源的.bat文件,修改系统注册表。
漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:...漫谈兼容内核之二十六:Windows的结构化异常处理(三)
《Windows 内核设计思想》主要包括了Windows 内核加载器(ntldr)的分析,Windows 内核调试组件的设计,实现结构化异常处理的支持,并对内存管理和对象管理进行了精心讲解,同时对基于IRP 请求包的I/O 系统进行了...