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