簡體   English   中英

為什么在我的 C++ 代碼中拋出這個確切的異常?

[英]Why is this exact exception thrown in my c++ code?

我正在分析我講座中的部分代碼。 我已經設法編譯它,但我無法理解:為什么我的程序輸出“Wyjatek”和 0 而不是“WyjatekNieoznaczony”?

我很確定 WyjatekNieoznaczony() 應該被拋出,因為 a=0 和 b=0 也是如此。 現在我有點困惑。 請問你能幫幫我嗎?

class Wyjatek {};
class WyjatekBledny : public Wyjatek {};
class WyjatekNieoznaczony : public Wyjatek {};

double f(double a, double b) {
    if (b == 0) {
        if (a == 0)
            throw WyjatekNieoznaczony();
        else
            throw WyjatekBledny();
    }
    return a / b;
}


double g(double a, double b) throw (int) {
    try {
        return f(a, b);
    }
    catch (WyjatekBledny) {
        cout << "Wyjatek bledny" << endl;
        throw 1;
    }
    catch (Wyjatek) {
        cout << "Wyjatek" << endl;
    }
    catch (WyjatekNieoznaczony) {
        cout << "Wyjatek nieoznaczony" << endl;
        throw;
    }
    return 0;
}

int main()
{
    double a = 0, b = 0;
    try {
        cout << g(a, b) << endl;
    }
    catch (...)
    {
        cout << "Inny wyjatek" << endl;
    }
    system("pause");
    return 0;
}

是的,確實拋出了WyjatekNieoznaczony ,但在捕獲站點, catch (Wyjatek) {是匹配項(由於繼承),因此它在那里被捕獲。

捕獲站點更像是行為中的if else塊 - 每個catch可能性都按照它們的編寫順序進行考慮 - 而不是一個switch塊,您可以在其中按您喜歡的任何順序放置標簽。

另請注意,通過const引用而非值來捕獲異常是個好主意,否則您可能會遇到對象切片的陷阱。

如果您啟用(並閱讀)編譯器警告,您會遇到以下診斷信息:

警告:“WyjatekNieoznaczony”類型的異常將被“Wyjatek”的早期處理程序捕獲[...]。

這基本上意味着WyjatekNieoznaczony ,通過從Wyjatek繼承,將首先被catch(Wyjatek)子句catch(Wyjatek) ,因為它是可轉換的。 問題在於,由於對象切片,它將失去其Nieoznaczony性。

我的建議是重新排序catch子句,這樣切片的可能性就消失了(在這種情況下):

catch (WyjatekBledny) {
    cout << "Wyjatek bledny" << endl;
    throw 1;
}
catch (WyjatekNieoznaczony) {
    cout << "Wyjatek nieoznaczony" << endl;
    throw;
}
catch (Wyjatek) {
    cout << "Wyjatek" << endl;
}

暫無
暫無

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

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