C++之解决、捕捉第三库或SDK接口的异常退出

9 篇文章 0 订阅
6 篇文章 0 订阅

       在开发中,经常会使用第三方库或SDK接口,以达到为我所用的效果;但是无法预估接口的具体细节,经常抛出异常、退出(例如abort)

#include<setjmp.h>
#include<signal.h>
jmp_buf env;
void signal_hander_fun(int signal_num)
{
    XMLLogger::getInstance()->writeLogUrl("OES_SDK_ERROR", QStringList() << u8"错误信号码:" + QString::number(signal_num));
    longjmp(env, 2);
}
namespace  {
#ifdef Q_OS_WIN
typedef void (*SigHander)(int);
#else
typedef __sighandler_t SigHander;
#endif
class SignalCapture
{
public:
    explicit SignalCapture()
    {
        _sigSegvHandler = signal(SIGSEGV, signal_hander_fun);
        _sigAbrtHandler = signal(SIGABRT, signal_hander_fun);
        _sigIntHandler = signal(SIGINT, signal_hander_fun);
        _sigIllHandler = signal(SIGILL, signal_hander_fun);
        _sigFpeHandler = signal(SIGFPE, signal_hander_fun);
        _sigTermHandler = signal(SIGTERM, signal_hander_fun);
#ifdef Q_OS_LINUX
        _sigBusHandler = signal(SIGBUS, signal_hander_fun);
        _sigQuitHandler = signal(SIGQUIT, signal_hander_fun);
#else
        _sigBrkHandler = signal(SIGBREAK, signal_hander_fun);
        _sigAbrtCompatHandler = signal(SIGABRT_COMPAT, signal_hander_fun);
#endif
    }
    virtual ~SignalCapture()
    {
        signal(SIGSEGV, _sigSegvHandler);
        signal(SIGABRT, _sigAbrtHandler);
        signal(SIGINT, _sigIntHandler);
        signal(SIGILL, _sigIllHandler);
        signal(SIGFPE, _sigFpeHandler);
        signal(SIGTERM, _sigTermHandler);
#ifdef Q_OS_LINUX
        signal(SIGBUS, _sigBusHandler);
        signal(SIGQUIT, _sigQuitHandler);
#else
        signal(SIGBREAK, _sigBrkHandler);
        signal(SIGABRT_COMPAT, _sigAbrtCompatHandler);
#endif
    }

private:
    SigHander _sigSegvHandler;
    SigHander _sigAbrtHandler;
    SigHander _sigIntHandler;
    SigHander _sigIllHandler;
    SigHander _sigFpeHandler;
    SigHander _sigTermHandler;
#ifdef Q_OS_LINUX
    SigHander _sigBusHandler;
    SigHander _sigQuitHandler;
#else
    SigHander _sigBrkHandler;
    SigHander _sigAbrtCompatHandler;
#endif
};

template<typename Callable, typename... Args>
int tryCall(Callable fun, Args&&... args)
{
    int ret = OES_SDK_ERROR;
    SignalCapture sigCapture;
    if(setjmp(env) != 0)
        return OES_SDK_ERROR;
    try
    {
        ret = fun(std::forward<Args>(args)...);
    }
    catch(...)
    {
    }
    return ret;
}

         通过tryCall模板函数可以捕捉异常退出的信号。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值