Q
構造函數和異常
2
A
回答
4
這些註釋是錯誤的,如果他們談論的是一般的構造函數。 Ctors確實可以正常投擲。也許那是在討論一個保證非伸縮建築的特定類?
另一方面,強烈建議您編碼,這樣您的析構函數永遠不會拋出。他們這樣做是合法的,但在堆棧展開期間拋出異常會導致程序立即終止(致電std::terminate
)。
4
1
您可以從構造函數中拋出異常,但要小心:如果對象構造不當,析構函數將不會被調用。
class Foo
{
public:
Foo(int i)
{
throw i;
}
~Foo()
{
std::cout << "~Foo()" << std::endl;
}
};
int main()
{
try
{
Foo f(42);
}
catch(...)
{
std::cout << "Catched" << std::endl;
}
return 0;
}
輸出:
Catched
爲了解決這個問題,你應該封裝一個構造到另一個:
Foo()
{
}
Foo(int i): Foo()
{
throw i;
}
輸出:
~Foo()
Catched
相關問題
- 1. 異常構造函數與異常Java
- 2. 構造函數和拋出異常
- 3. 異常處理和構造函數
- 4. RAII和構造函數中的異常
- 5. 從構造函數調用構造函數並捕獲異常
- 6. 統一參數構造函數異常
- 7. 構造函數中的異常,java
- 8. 處理構造函數的異常
- 9. ServerSocket的構造函數拋出異常
- 10. 在構造函數中捕獲異常
- 11. NullPointerException異常的構造函數定義
- 12. 從構造函數中拋出異常
- 13. PHP從構造函數rethrow異常
- 14. 如何捕獲構造函數異常?
- 15. REST異常需要構造函數
- 16. EJB3構造函數拋出異常?
- 17. 構造函數返回值的異常
- 18. Angular2,構造函數DI拋出異常
- 19. 移動構造函數和非常拷貝構造函數
- 20. 運行析構函數,當構造函數拋出異常
- 21. 通過__init__構造對象並忽略構造函數異常
- 22. 異常異常構造
- 23. Android和GSON投擲No-Args構造函數未找到異常
- 24. 構造函數異常和動態分配
- 25. C#構造函數和常量神祕
- 26. 常量和重載構造函數
- 27. 異常構造類
- 28. C++:構造器之間的差異()和構造函數(無效)
- 29. 的Javascript同時創造「不是構造函數」異常物體
- 30. 默認構造函數與正常構造函數的類C++
鑑於'new'可以拋出,我會說你的「A」是錯誤的。 – DavidO
也許這意味着「構造函數不能返回錯誤,所以通知構造錯誤的慣用方式是拋出異常」...... – juanchopanza