[英]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_time
或std::exception
及其派生類以外的任何其他內容,則將觸發第二個catch
塊。 來自 C++ FAQ 的有用閱讀:我應該拋出什么?
正如所寫, throw
語句拋出一個類型派生自std::exception
的對象,因此它被第一個catch
子句catch
。 如果你把投擲改為throw 3;
異常將被第二個catch
子句catch
,而不是第一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.