簡體   English   中英

C++ catch(std::exception & e) 與 catch(...)

[英]C++ catch(std::exception & e ) vs. catch(...)

我知道處理這兩個捕獲的區別,但是橢圓捕獲 std::exception 捕獲不會捕獲的東西需要什么?

例如:

try
{
    throw std::runtime("runtime error!");
}
catch(const std::exception& e)
{
    std::cout << "Exception: " << e;
}
catch(...)
{
    std::cout << "How did I get here?";
    throw;
}

我已經看到將這兩種方法結合使用的代碼示例,但我沒有看到您同時使用這兩種方法的理由。

catch(const std::exception& e)

只會捕獲 std 異常。

catch(...)

之后會抓住一切。

您可以處理整數和其他類型( http://www.cplusplus.com/doc/tutorial/exceptions/

例如:

catch(int e)

雖然它絕對是一個好主意,這樣做,你就不必從派生自定義異常std::exception C++ 允許您拋出幾乎任何對象類型。

所以throw 1; 例如,不會由您的第一個處理程序處理。 而且也不會...

class MyCustomException { // Doesn't derive
 ///
};

...如果它被拋出。

你可能的意思是:

throw std::runtime_error("runtime error!"); // not std::runtime

std::runtime_error派生自std::exception ,因此您的第一個 catch 塊在捕獲std::exception類型的異常時被觸發。 你可能的意思是:

std::cout << "Exception: " << e.what(); // not e

如果您拋出std::run_timestd::exception及其派生類以外的任何其他內容,則將觸發第二個catch塊。 來自 C++ FAQ 的有用閱讀:我應該拋出什么?

正如所寫, throw語句拋出一個類型派生自std::exception的對象,因此它被第一個catch子句catch 如果你把投擲改為throw 3; 異常將被第二個catch子句catch ,而不是第一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM