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++ 函数抛出一个不在它自己参数列表中的异常时才会触发,局限性比较大。

目录
相关文章
|
4月前
|
监控 Java
捕获线程执行异常的多种方法
【10月更文挑战第15天】捕获线程执行异常的方法多种多样,每种方法都有其特点和适用场景。在实际开发中,需要根据具体情况选择合适的方法或结合多种方法来实现全面有效的线程异常捕获。这有助于提高程序的健壮性和稳定性,减少因线程异常带来的潜在风险。
53 1
|
4月前
|
监控 API
Hook 线程与捕获线程执行异常
【10月更文挑战第11天】Hook 线程和捕获线程执行异常是多线程编程中不可或缺的技术。通过深入理解和掌握这些方法,我们可以提高程序的稳定性和可靠性,更好地应对各种异常情况。同时,在实际应用中要注意平衡性能和准确性,制定合理的异常处理策略,以确保程序的正常运行。
54 1
|
8月前
|
消息中间件 程序员 Windows
Windows消息机制《MFC深度详解》
Windows消息机制《MFC深度详解》
154 1
|
9月前
在程序运行过程中,线程的状态是什么?进来看看就通透了
在程序运行过程中,线程的状态是什么?进来看看就通透了
63 0
Java多线程:捕获线程异常
你处理过多线程中的异常吗?如何捕获多线程中发生的异常?捕获子线程的异常与捕获当前线程的异常一样简单吗?
|
存储 Java
高并发编程-捕获线程运行时的异常 + 获取调用链
高并发编程-捕获线程运行时的异常 + 获取调用链
118 0
|
编译器 C语言
《C陷阱与缺陷》之“语义”陷阱——数组越界导致的程序死循环问题
《C陷阱与缺陷》之“语义”陷阱——数组越界导致的程序死循环问题
165 0
|
监控 Java Android开发
RxJava 异常时堆栈显示不正确?解决方法都在这里
RxJava 异常时堆栈显示不正确?解决方法都在这里
158 0
RxJava 异常时堆栈显示不正确?解决方法都在这里
|
Unix Linux C#
iOS开发:Crash异常总结与捕获
说到异常捕获,就必须要提到Crash问题,iOS中,Crash一般分为两种: 1、一种是由EXC_BAD_ACCESS引起的,原因是访问了不属于本进程的内存地址,有可能是访问已被释放的内存; 2、一种是未被捕获的目标C异常(NSException)记录,导致程序向自身发送了SIGABRT信号而崩溃。
962 0
iOS开发:Crash异常总结与捕获
对线程中未捕获的异常进行处理UncaughtExceptionHandler
对线程中未捕获的异常进行处理UncaughtExceptionHandler