簡體   English   中英

C ++如何處理引發異常的初始化程序

[英]c++ how to handle initializer that throws exceptions

一個非常簡單的問題,如何處理初始化可能會從其構造函數引發異常的類成員變量?

class main
{
public:
    main() c(...) {};
private:
    my_class c;
};

class my_class
{
public:
    inline my_class() : o(...) { };

private:
    some_obj o;
};

顯然,您不能在構造函數的初始值設定項中嘗試catch異常,那么在構造函數的try catch塊內構造對象會更合適嗎?

這是頂級類,因此處理異常以使用戶知道發生了什么並正常退出是優先於使程序由於異常而崩潰的優先級嗎?

class main
{
public:
    main()
    {
        try
        {
            c(...);
        }
        catch(...)
        {
            ...
        }
    };
private:
    my_class c;
};

但是,這是行不通的,因為在對象在構造函數中進行初始化之前,該對象已被初始化一次,因此,如果該對象引發異常,則程序可能會崩潰。

您需要的是function-try-block 它是專門為解決您的問題而設計的。

class main
{
public:
    main() try : c(...)
    {
        std::cout << "constructed, c = " << c << std::endl;
    }
    catch(...)
    {
        std::cerr << "failed to construct c = " << c << std::endl;
    } // implicit throw; here

private:
    my_class c;
};

為什么不能在構造函數中捕獲錯誤? 根據這個問題,這似乎是標准做法。

暫無
暫無

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

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