[英]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.