簡體   English   中英

在C ++中,是否可以拋出一個不會被std :: exception捕獲的異常?

[英]In C++, is is possible to throw an exception that will not be caught by std::exception?

問題1:

有可能拋出一個不會被std :: exception捕獲的異常嗎?

try
{
}
catch(std::exception & e)
{
}
catch(...)
{
  //Is this block needed?
}

問題2:

有沒有更好的:

catch(std::exception & e)

要么

catch(std::exception e)

要么

catch(const std::exception &e)//<--- this is the method I usually use

Q1:是的。 你可以拋出任何類型,而不是從std :: exception繼承的必要類型。
你可以寫throw 1; 拋擲和int或throw "hello"; 拋出一個char* ,它們都不從std::exception繼承。 然而,這被認為是不好的做法,因為班級的用戶不能指望你扔任何東西。 如果您不想從std::exception繼承,那么您通常會創建自己的異常層次結構。

Q2:按值捕獲異常(第二個選項)是一種不好的做法,因為您強制復制異常實例,並且可能執行可能導致進一步異常的分配。
使用第一個選項建議您打算在catch塊中更改e ,這也是您可能希望避免的,因為異常通常在創建后保持不可變。 唯一剩下的就是第三種選擇。

當然,你可以拋出你想要的任何類型,並且它不需要從std::exception派生。

捕獲const引用更好。 原因是你可以拋出一個const或一個非const ,它可以被非const捕獲。 它的作用類似於靜態拋棄const

你的第二個問題的答案是你應該按價值投擲並通過引用捕獲。 如果按價值捕獲,您可能會得到“ 對象切片 ”。

有時需要拋出一個不從std :: exception繼承的異常。 在運送共享庫時,最佳做法是重新實現或包裝大多數std庫類型,而不是直接暴露使用它們的方法/函數,因為它可能導致各種鏈接器/編譯器互操作性問題。

暫無
暫無

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

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