昨天晚上加班解決了一個問題,是因爲沒法正確的捕獲到異常致使的。剛開始用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; }