建構函式與解構函式是否可以丟擲異常

無鞋童鞋發表於2017-08-13

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

相關文章