簡體   English   中英

為什么我的析構函數異常沒有被捕獲

[英]why my exception from a destructor is not caught

class D
{
public:
    ~D() { throw std::exception(); }
};
int main()
{
    try
    {
        try
        {
            D d;
        }
        catch (...)
        {
            cout << "1";
        }
    }
    catch (std::exception& e)
    {
        cout << "2";
    }
}

我的輕描淡寫是,這應該在2中捕獲。但是它沒有捕獲,而是終止了程序。

在C ++ 11中,析構函數隱式為noexcept ,因此,如果析構函數拋出未在析構函數本身內捕獲的異常,則將自動調用std::terminate

甚至在此之前,在堆棧展開期間拋出未捕獲的異常的析構函數會導致std::terminate被調用,因此,如果析構函數被使氣泡冒泡的其他異常調用,則您正在執行的操作將無效。

如果這~D() noexcept(false) ,則可以將析構函數顯式聲明為~D() noexcept(false) (如果析構函數不是由引起堆棧展開的其他異常觸發的,則允許異常冒泡從析構函數中冒出)。

請注意,盡管從技術上講這是合法的,但在析構函數中引發未捕獲的異常通常被認為是一個壞主意,因為這會使您的類在可能引發可處理異常的任何情況下基本上都無法使用。 您可以在析構函數中的c ++異常中了解更多信息(這不是嚴格的重復,但完全涵蓋了您的情況)。

暫無
暫無

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

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