2009-05-25 13 views

回答

11

問題1:是的。你可以拋出任何類型,而不是從std :: exception繼承的必要類型。
你可以寫throw 1;扔和int或throw "hello";char*,這兩個都不從std::exception繼承。然而這被認爲是不好的做法,因爲這個類的用戶不能指望你拋出任何東西。如果你不想從std::exception繼承,你通常會做的是創建自己的異常層次結構。 Q2:通過值捕獲異常(第二個選項)是一種不好的做法,因爲您強制異常實例被複制,並且可能執行可能導致進一步異常的分配。
使用第一個選項建議您打算在catch塊中更改e,這也是您可能想要避免的,因爲異常通常在創建後保持不可變。唯一剩下的就是第三種選擇。

6

可以肯定的是,你可以扔任何你想要的類型,而且它不需要從std::exception派生。

抓住const參考更好。原因是您可以投出const或非const,並且它可以被非const捕獲。這就像一個無聲的鑄造const

+1

例如,「throw 1;」是合法的。 – ChrisW 2009-05-25 21:30:37

+0

我愛'扔'Fnugle未找到''的測試代碼。 – peterchen 2009-05-25 21:33:25

+0

你能舉個例子說明爲什麼最好用const來捕捉?一個危險的情況,你趕上了std :: exception e呢? – 2009-05-25 21:35:36

4

你的第二個問題的答案是,你應該拋棄價值,並通過引用趕上。如果你按價值捕獲,你可能會得到'object slicing'。

0

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

相關問題