vc中异常捕捉的最后一道屏障-SetUnhandledExceptionFilter

简介:

 

在C++中定义了很多异常捕捉机制,但是在VC中在win平台上有一个更高层的异常处理机制,函数SetUnhandledExceptionFilter,这个函数很有用,它是异常捕捉的最后一道屏障。它有这样的规则,对于未捕捉的异常并且未在调试状态下(通常就是只在release中),将自动调用这里面的异常处理函数。

默认的异常处理函数就是弹出一个对话框,告诉你程序异常了,而在发布软件时,你可以用其他函数替代,优雅的结束程序。这个处理函数的定义是这样的:

LONG WINAPI myUnhandledExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo)
{
 ...

return
}

 

这个函数有三种返回值,来表示不同的程序行为:

 

EXCEPTION_EXECUTE_HANDLER
0x1

Return from UnhandledExceptionFilter and execute the associated exception handler. This usually results in process termination.

EXCEPTION_CONTINUE_EXECUTION
0xffffffff

Return from UnhandledExceptionFilter and continue execution from the point of the exception. Note that the filter function is free to modify the continuation state by modifying the exception information supplied through itsLPEXCEPTION_POINTERS parameter.

EXCEPTION_CONTINUE_SEARCH
0x0

Proceed with normal execution of UnhandledExceptionFilter. That means obeying theSetErrorMode flags, or invoking the Application Error pop-up message box.

第一种就是悄悄的终止程序了

第二种就是从这个异常处继续执行

第三种就是调用默认的方法,可能就是弹出一个框,当然这个默认的方法通常是遵循SetErrorMode 的模式。

 

其实标准C++中也有一个类似的函数set_unexpected,区别是,这个函数的执行情况比较有限制,只是当C++ 函数抛出一个不在它自己参数列表中的异常时才会触发,局限性比较大。

目录
相关文章
|
11天前
|
Java
捕捉不到异常
捕捉不到异常
8 0
|
5月前
|
前端开发 rax Linux
【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常
【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常
66 0
|
4月前
|
Java
Java异常处理:解释一下异常的传播机制。
Java异常处理:解释一下异常的传播机制。
49 1
|
11月前
|
存储 Java
高并发编程-捕获线程运行时的异常 + 获取调用链
高并发编程-捕获线程运行时的异常 + 获取调用链
67 0
|
监控 Java Android开发
RxJava 异常时堆栈显示不正确?解决方法都在这里
RxJava 异常时堆栈显示不正确?解决方法都在这里
118 0
RxJava 异常时堆栈显示不正确?解决方法都在这里
|
Unix Linux C#
iOS开发:Crash异常总结与捕获
说到异常捕获,就必须要提到Crash问题,iOS中,Crash一般分为两种: 1、一种是由EXC_BAD_ACCESS引起的,原因是访问了不属于本进程的内存地址,有可能是访问已被释放的内存; 2、一种是未被捕获的目标C异常(NSException)记录,导致程序向自身发送了SIGABRT信号而崩溃。
679 0
iOS开发:Crash异常总结与捕获
对线程中未捕获的异常进行处理UncaughtExceptionHandler
对线程中未捕获的异常进行处理UncaughtExceptionHandler
Java异常被抛出或被捕获之后,代码是否继续执行的问题
在写程序的时候,我们经常被教导,要对异常的信息进行处理,哪里该抛出异常。但是,更多的时候,我们只是模仿异常的抛出,却不知道为什么要这样抛异常(被catch了?被向上抛了?后面的代码是否执行了?)。 接下来,我就简单的说一下异常抛出后的代码执行问题。
7040 1