C++深入理解(12)------異常詳解(讀書筆記)

        很早就知道異常機制了,通過try、catch塊可以截獲到常常造成系統崩潰等的異常。這樣就可以防止服務器崩潰等問題。但是我們平常也只是簡單的使用,並未瞭解其內部的原理。恰好看到這裏,將心得記錄下來。

      最簡單的用法就是:

try
{

}
catch(...)
{
}

        catch(...)表示可以截獲任何異常,只要try中有奔潰的錯誤等,如數組越界就會直接被catch塊截獲,然後可以打印一些錯誤信息等等。catch當然也可以截獲具體的消息,必須與throw相對應。比如throw “hello”,catch(const char *s),那麼就相當於const char*就是catch中的一個參數。當然這個參數也可以接收類,如類A,throw a---catch(const A&a)。

        C++98定義了異常的幾種規範,但是C++11卻取消了相關規範,認爲規範是不好的,雖然不用,但是這裏依然列出,方便看到老代碼的時候知道其意義。

void func() throw();                 不拋出任何異常
void func() throw(bad thing);        可能拋出異常
void func() noexcept;                不拋出任何異常  

        關於棧解退,在調用函數的時候,通常會將調用之前的地址傳入新的堆棧中,以便執行完函數之後,根據這個地址找到原來的位置,而新的函數也是一個新的棧,這個棧保存傳入的參數,以及自己創建的自動變量的參數,然後在執行完後會進行推棧操作,將臨時的參數銷燬。當引發異常時,就會從異常處推棧,將此函數創建的局部變量或者對象銷燬,執行對象等的析構函數,保證了內存不會泄露。然後向後退到try塊中,並查找有沒有接收異常的catch塊,如果有進入這個塊內,沒有的話就要退出整個程序。

       還有一個知識點需要說明,throw 對象a;實際上throw a的副本,因爲在throw之後,整正的a就被銷燬了,系統臨時創建一個副本,以方便catch接受,在cahch語塊結束後,該臨時變量也會被銷燬。那既然是臨時變量爲什麼在catch時用引用,是因爲引用可以訪問其派生類。

       C++爲我們提供了一個exception的基類(在頭文件exception中),我們在自己寫類的時候,可以繼承這個類,就擁有了catch(exception&)的能力,具體怎麼使用可以查相關資料,這裏不做詳細介紹。同時,在發生未捕獲異常的時候,可以修改系統的反應,調用set_teminate()。因爲發現未捕獲異常的時候先調用teminate()函數,然後此函數調用abort(),導致程序終止。

      

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章