建構函式與解構函式是否可以丟擲異常
1 示例程式
首先我們來看一個簡單的在建構函式和解構函式中丟擲異常的小程式,如下:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "construction fun" << endl;
throw 1;
}
~A()
{
cout << "destruction fun " << endl;
throw 2;
}
};
int main()
{
try
{
A a;
}
catch(...)//catch all
{
cout << "caught!" << endl;
}
system("pause");
return(0);
}
//輸出
//construction fun
//caught!
//註釋掉"throw 1",輸出(因為如果構造中丟擲異常解構函式不會被執行)
//construction fun
//destruction fun
//caught!
2 總結
建構函式異常,可以總結如下:
① C++中通知物件構造失敗的唯一方法那就是在建構函式中丟擲異常;
② 建構函式丟擲異常時,解構函式將不會被執行;
③ 丟擲異常時,其子物件將被逆序析構。
解構函式異常,可以總結如下:
① C++中解構函式的執行不應該丟擲異常;
② 當在某一個解構函式中會有一些可能(哪怕是一點點可能)發生異常時,那麼就必須要把這種可能發生的異常完全封裝在解構函式內部,決不能讓它丟擲函式之外;
③ 丟擲異常時,其子物件將被逆序析構。
解構函式異常相對要複雜一些,存在一種衝突狀態,程式將直接崩潰:異常的被稱為“棧展開(stack unwinding)”的過程中時,從解構函式丟擲異常,C++執行時系統會處於無法決斷的境遇,因此C++語言擔保,當處於這一點時,會呼叫 terminate()來殺死程式。因此,當處理另一個異常的過程中時,不要從解構函式丟擲異常。
參考自:
http://blog.csdn.net/believefym/article/details/1836156
相關文章
- 建構函式中丟擲的異常函式
- 建構函式與解構函式函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- 關於建構函式與解構函式的分享函式
- 虛解構函式(√)、純虛解構函式(√)、虛建構函式(X)函式
- 建構函式詳解函式
- C++ 建構函式和解構函式C++函式
- 類的建構函式和解構函式函式
- 建構函式與普通函式的區別函式
- ## 建構函式函式
- 建構函式函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- C++ 類建構函式和解構函式C++函式
- [譯] 建構函式已死,建構函式萬歲!函式
- JS 建構函式與類JS函式
- Java建構函式詳解Java函式
- C++建構函式解構函式的執行過程C++函式
- c# tcbs之建構函式呼叫建構函式示例C#函式
- C/C++——建構函式、複製建構函式和解構函式的執行時刻C++函式
- JavaScript 建構函式JavaScript函式
- 建構函式、this、static函式
- 異常處理與異常函式函式
- 理解建構函式與原型物件函式原型物件
- C++入門記-建構函式和解構函式C++函式
- [C++]顯示呼叫建構函式和解構函式C++函式
- 第4周課後實踐·閱讀程式-建構函式與解構函式(1)函式
- c++建構函式詳解C++函式
- C++語言之結構體、類、建構函式、拷貝建構函式C++結構體函式
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- 建構函式建立物件函式物件
- JavaScript Date()建構函式JavaScript函式
- 11-建構函式函式
- javascript Function()建構函式JavaScriptFunction函式
- 【C++】建構函式C++函式
- C++建構函式C++函式
- 3.建構函式函式
- Java的建構函式Java函式