windows未处理异常

以下内容引述《windows核心编程》

未处理异常

异常过滤函数返回EXCEPTION_CONTINUE_SEARCH,系统会继续在调用树的上层寻找异常过滤函数。如果每个异常过滤程序都返回EXCEPTION_CONTINUE_SEARCH,我们就会遇到所谓的未处理异常。

微软提供了函数SetUnhandleExceptionFilter,它给我们处理异常的最后机会,否则widows会正式认为这个异常没有得到处理。

PTOP_LEVEL_EXCEPTION_FILTER SetUnhandleExceptionFilter(
	PTOP_LEVEL_EXCEPTION_FILTER pTopLevelExceptionFilter);

在进程初始化调用这个函数,一旦调用这个函数,进程中任意线程抛出未处理异常都会导致我们制定的最上层异常过滤函数执行。这个异常过滤函数必须与下面类似

LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCETIOIN_POINTERS pExceptionInfo);

异常过滤函数中,只要返回一下三个EXCEPTION_*标志符之一,就可以做任何我们想要做的处理。
异常过滤函数中,尽可能少地实现代码逻辑,不要再申请动态内存。

标识符 对应结果
EXCEPTION_EXECUTE_HANDLER 进程在不给用户任何通知的情况下悄然终止。注意全局展开会被引发,所以finnaly代码块会执行
EXCEPTION_CONTINUE_EXECUTION 从抛出异常的指令继续执行,我们可以修改由PEXCEPTION_POINTERS参数指向的异常信息。如果我们不修正异常的错误,同样的异常还会再一次被抛出,于是进程将进入异常不断被抛出的无限循环
EXCEPTION_CONTINUE_SEARCH 异常不会得到任何处理

当我们设置新的未处理异常时,SetUnhandledExceptionFilter返回上次安装的异常过滤后程序的地址。
如果程序使用的是C/C++运行库,在进程入口点函数开始执行前,C/C++运行函数就会安装一个默认的全局异常过滤函数,即__CxxUnhandledExceptionFilter。
这个函数很简单,首先检查异常是不是属于C++异常,如果是,则在结束的时候调用abort函数;如果不是,则会返回一个EXCEPTION_CONTINUE_SEARCH,来让windows处理这个未处理异常。

如果调用SetUnhandledExceptionFilter来安装我们自己的全局异常过滤程序,其返回的地址即为__CxxUnhandledExceptionFilter的地址。
如果过滤程序即将返回EXCEPTION_CONTINUE_SEARCH,可能想在此之前调用之前的全局异常过滤程序,它的地址可以通过SetUnhandledExceptionFilter的返回值得到。

在windows程序中,每个线程的执行都是从NTDLL.dll中的函数BaseThreadStart开始的

void BaseThreadStart(PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值