关于C++异常机制的笔记(SEH, try-catch)

昨天晚上加班解决了一个问题,是因为没法正确的捕获到异常致使的。刚开始用try-catch,可是无法捕获到异常;后面改为SEH异常才解决。所以今天将这个问题从新梳理了一遍,关于try-catch, SEH的基本知识,你们能够从MSDN(https://msdn.microsoft.com/en-us/library/4t3saedz(v=vs.100).aspx),或者自行查找亦可。 测试

关于两者之间的使用区别,作了些小小的测试,代码以下(OK-捕获异常、FAILED-未捕获异常):spa

void JsonTest()
{
    char szJson[] = "{\"val\":1}";
    Json::Reader reader;
    Json::Value root;
    if (false == reader.parse(szJson, root, false))
    {
        DEBUGA(DBG_DEBUG, "return false, JSON parse FAILED.");
        return ;
    }

    int val = root["val"].asInt();
    string val2 = root["val"].asString();
}

void StrTest()
{
    wstring strVal = L"a";
    strVal.at(10);
}

void NULLPtrTest()
{
    int* p = NULL;
    *p = 1;
}

void ZeroTest()
{
    int z = 0;
    double d = 100 / z;
    z = 100;
}

void OutRangeTest()
{
    char arr[] = "abc";
    char c = arr[5];
}

void TryCatchTest()
{
    try
    {
        JsonTest();        // OK
        StrTest();        // OK
        NULLPtrTest();    // FAILED
        ZeroTest();        // FAILED
        OutRangeTest();    // FAILED
    }
    catch (...)
    {
        MessageBox(0, L"try-catch", 0, 0);
    }
}

void SEHTest()
{
    __try
    {
        JsonTest();        // OK
        StrTest();        // OK
        NULLPtrTest();    // OK
        ZeroTest();        // OK
        OutRangeTest();    // FAILED
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        MessageBox(0, L"SEH", 0, 0);
    }
}

int main()
{
    TryCatchTest();
    SEHTest();
    retrun 0;
}
相关文章
相关标签/搜索