栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

#include
#include
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
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)...);
    }
    catch(...)
    {
    }
    return ret;
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/396110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号