【转载】探索 Windows 平台下的 C++ 异常捕获策略:如何让Windows C++应用程序尽可能捕获所有异常?

探索 Windows 平台下的 C++ 异常捕获策略:如何让Windows C++应用程序尽可能捕获所有异常?

来份菠萝咕咾肉

来份菠萝咕咾肉

Don't lie to yourself.

8 人赞同了该文章

前言

这个标题起的有点纠结,感觉不太好起。实际上本文想要讨论的场景,是一个比较经典的Windows C++商业应用软件的开发需求:我们希望能够在程序发生异常并崩溃时,能够弹出对用户比较友好的崩溃提示窗口,并且生成dump文件上传到服务器上,让开发人员能够获取并分析。

因此,本文提出一套捕获Windows平台下C++程序异常的方案,经过长时间的线上验证,是可以捕获到绝大多数的异常的。至于为什么不是所有异常,我们后面再讨论。

程序示例

先给出程序示例,再讨论其中的原理。

void InstallUnexceptedExceptionHandler()
{
    //SEH(Windows 结构化异常处理),属于Win32 API
    ::SetUnhandledExceptionFilter(UnhandledStructuredException);
    //C 运行时库 (CRT) 异常处理,由 CRT 提供的异常处理机制。
    _set_purecall_handler(PureCallHandler);
    _set_new_handler(NewHandler);
    _set_invalid_parameter_handler(InvalidParameterHandler); 
    _set_abort_behavior(_CALL_REPORTFAULT, _CALL_REPORTFAULT);
    //C 运行时信号处理,由 CRT 提供的信号处理机制。
    signal(SIGABRT, SigabrtHandler);
    signal(SIGINT, SigintHandler);
    signal(SIGTERM, SigtermHandler);
    signal(SIGILL, SigillHandler);
    //C++ 运行时异常处理,API由标准库提供
    set_terminate(Terminate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值