处理C ++中的无效参数异常

时间:2017-07-05 17:16:20

标签: c++ linux porting

我有以下用CLI C ++编写的代码:

static void BadTraceHandler(const wchar_t* expression,
    const wchar_t* function, 
    const wchar_t* file, 
    unsigned int line, 
    uintptr_t pReserved)
{
    UNREFERENCED_PARAMETER(expression);
    UNREFERENCED_PARAMETER(function);
    UNREFERENCED_PARAMETER(file);
    UNREFERENCED_PARAMETER(line);
    UNREFERENCED_PARAMETER(pReserved);

    sBadTrace = 1;
}

void func ()
{
    newHandler = BadTraceHandler;
    oldHandler = _set_invalid_parameter_handler(newHandler);

    _CrtSetReportMode(_CRT_ASSERT, 0);
    sBadTrace = 0;

    __try
    {
        vsnprintf_s((char*)pDisplayStr, MAX_TRACE_LEN, _TRUNCATE, (char*)pTempFormat, (va_list)pList);
    }
    __except(1)
    {
        sBadTrace = 1;
    }   

    _set_invalid_parameter_handler(oldHandler);
    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
}

此代码的目标是在函数vsnprintf_s收到错误参数的情况下将sBadTrace基本设置为1,并且为此目的使用两个机制--__try,__ except(1)和_set_invalid_parameter_handler。标准C ++中不支持这些(它们是Microsoft特定的)。

我正在努力使这个代码与Linux兼容,所以我在STL C ++中重新连接它。 为了实现这一点,我改变了__try,__ except(1)来尝试,捕获(...),我希望在参数无效的情况下也能正常工作(虽然我无法获得有关异常类型的信息vsnprintf_s抛出)。它是等效的代码吗?

至于_set_invalid_parameter_handler - 我不知道如何在Linux中复制这种机制。我知道所有关于使用信号的信息,但是当无效参数传递给函数时,我无法找到触发的信号。

0 个答案:

没有答案