關於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;
}
相關文章
相關標籤/搜索