這是一個面試問題,面試已經完成。即使從類中拋出異常,C++程序能否正常工作?
給出A類,B類和C類成員。 如果在C類的構造函數中發生異常,但程序仍然可以正常工作,原因是什麼?
我的回答:
C'S構造不答或執行類,A沒有一些指令對C類執行某些操作
C類沒有任何實例。
異常不是錯誤。異常處理函數很好地處理它。
有什麼更好的點子?
謝謝!
這是一個面試問題,面試已經完成。即使從類中拋出異常,C++程序能否正常工作?
給出A類,B類和C類成員。 如果在C類的構造函數中發生異常,但程序仍然可以正常工作,原因是什麼?
我的回答:
C'S構造不答或執行類,A沒有一些指令對C類執行某些操作
C類沒有任何實例。
異常不是錯誤。異常處理函數很好地處理它。
有什麼更好的點子?
謝謝!
程序可以繼續工作,如果設計這樣做的話,但類型A的對象的構造必須失敗,因爲如果對象的任何基礎或成員未能初始化,則不可能完全構建對象。
這將有可能爲一個類來保存由擁有指針的對象,併爲它沒有舉行對象構造提供了厚望不會從initailizer列表逃脫。例如。
struct C {
C();
};
struct A {
A();
std::unique_ptr<C> c;
};
A::A() {
try {
c.reset(new C);
}
catch (...){
// oops. Can't re-throw, could log
}
}
如果C
實例是A
類的可選部件,即具有零值指針C
實例是OK。那麼,假設正確的異常處理就沒有問題了。
要成功構建一個對象A
,您需要成功構建其成員(在此例中爲B
和C
)。如果程序正確使用,這意味着它可以從創建A
對象失敗中恢復。
程序必須已經引起了從A
的構造函數拋出的異常和處理以某種方式錯誤情況。例如,您可以將一組不同的參數傳遞給A
的構造函數(它將不同的參數傳遞給其現在不拋出的成員函數)。基於替代配置值。
或者有一種替代方法可以解決不涉及創建類型爲A
的對象的原始問題(例如,這種替代路徑的計算可能更昂貴,這可能是它不是第一選擇的原因) 。
我認爲這就是指這樣的語法:
A::A() try : B(...),C(...)
{
//A constructor body
}
catch(...) {}
編輯沒關係,每個異常catch塊中沒有明確重新拋出自動重新拋出
見this