2013-01-24 76 views
0

我對try函數的理解是爲了防止try和catch之間可能發生的錯誤。 但是,如果我做這樣的事情:使用try catch並拋出

std::vector<int> testvector; 
testvector.push_back(1); 

try{ 
cout << testvector[53485375345534] << endl; 
}catch(...){ 

} 

我的想法是,它不會在消費導致錯誤的內存,但它確實沒有在這種情況下,錯誤仍然彈出。

有人能解釋我的經驗使用try,至今合適的理由,我本來if語句,而不是事先使用的,可能有人給我一個例子,當你需要一個try語句?

+2

我很抱歉地告訴你,但你可能誤解了'try'和'catch'的用途。他們**不是**旨在*停止*錯誤。相反,它們可以讓你處理錯誤。一旦出現錯誤,總會出現錯誤。 –

+1

也注意到文字'53485375345534'可能對您的編譯器來說太大了;對於你的測試用例,只需使用'1'或'2'。 –

回答

2

有不同類型的錯誤:

  1. 例外。這些是您的程序創建的錯誤,並且您可以catch和句柄。
  2. 訪問衝突,系統異常等,又名「崩潰」。這些都非常嚴重,當它們發生時你不會做太多事情(至少不在標準C++的可能範圍內),所以最好編寫正確的程序,然後這些程序不會出現。
  3. 斷言。這些是爲了在開發和測試過程中檢查你的程序邏輯和約束。它們通常只出現在調試代碼中,即它們應該在發佈版本中關閉。如果發生斷言,在Windows中會彈出一個窗口,指出哪裏出了問題。

我只是在這裏猜測 - 你使用MS Visual Studio嗎?

MSVC的矢量實現在調試模式下檢查operator[]的參數,如果參數確實在矢量的範圍內,則聲明。這種說法是不是是一個例外,所以你不能抓住它。

3

operator []std::vector檢查範圍。

但是,std::vector::at()確實會引發異常。你應該改用它。

1

你的測試用例是無效的,std::vector::operator[]不做boundry檢查,也不會拋出異常,你期待未定義行爲,而不是例外。你可以試試std::vector::at函數

std::vector<int> testvector; 
testvector.push_back(1); 

try{ 
    std::cout << testvector.at(53485375345534) << endl; 
}catch(std::exception& e){ 
    std::cout << e.what() << std::endl; 
} 
0

當你使用一些你不確定的函數時,你會使用一個throw語句。例如,你想創建一個GUI窗口,你將使用一個try塊,所以如果沒有創建窗口,最終不會在不存在的窗口上等待輸入。

1

Try-Catch的概念是處理可能會破壞程序的錯誤,但大多數情況下可以在沒有這樣做的情況下進行處理。 您的示例適用於完全正確的操作,但只有在您請求的數據存在的情況下才是正確的。這個「只有當」可以由函數本身來處理,但是你永遠無法對錯誤的輸入做出反應。相反,函數會在這種情況下拋出一個異常,如果用Try-Catch包圍調用,則可以由您的代碼處理異常。 在Catch塊內,經常會意識到您通知用戶或至少將錯誤行爲寫入日誌文件,並且您還可以加載默認值,甚至可以更改變量並重復該函數調用。 有時Try-Catch被描述爲「請求寬恕而不是允許」(後者將是事先If)。

一般在try-catch可以用僞讀作:

Try: 
    Do what you think is right to do but be aware it could be wrong... 
Catch: 
    You were too optimistic and should react in a proper way... 

我希望有助於瞭解在try-catch概念好一點。