關於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-未捕獲異常):

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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM