++異常處理模型除了支援面向過程的c風格程式中的異常處理外(就是沒有物件導向的概念,完全是c程式,整個程式實際就是函式的集合,但卻用c++編譯器來編譯這樣的c程式,所以這樣的程式中是可以a使用c++的異常處理機制的,要不怎麼說c++是相容c語言的呢?但是需要注意的是,單純的c語言程式中是不能使用c++異常處理模型進行程式設計的。是不是有點說拗口了?有點糊塗了呢?其實很簡單,那就是如果程式中使用了c++異常處理機制,也即**中有try、catch和throw關鍵字,那麼就必須使用c++編譯器來編譯這個程式。許多程式設計師朋友們在這裡有乙個理解上的誤區,認為只有程式中使用了物件導向的概念,即使用class關鍵字來定義乙個類結構才算得上c++程式,其實這種理解是片面的,如果程式中採用了c++異常處理機制,那麼也有理由認為這是乙個c++程式,哪怕程式的**完全是c語言風格的,並且這樣的程式用c編譯器來編譯肯定將會報錯,提示未定義的try標示符等等錯誤資訊),還支援物件導向程式中物件丟擲的異常處理。
c++異常處理模型的確和物件導向是緊密結合的,除了在相遇篇中介紹到的用物件來描述程式中出現的異常之外,c++異常處理模型也對在物件導向程式中的物件例項所丟擲的異常作了最完善的支援和處理。也許大家會覺得這很容易,沒什麼了不起的地方。但恰恰相反,實際上這才是c++異常處理模型最成功、最不可思議和最閃光的地方。而且由於c++異常處理模型對物件導向有了很好的支援和相容,才使得c++異常處理模型本身的實現變得特別複雜,因為它需要跟蹤每乙個物件的運**況和狀態(關於c++異常處理模型的實現,會在愛的秘密篇中有詳細剖析)。本文和接下來的幾篇文章將講述當物件例項丟擲異常時將如何處理。
物件的生命週期一般有三種狀態:構造、執行和析構銷毀。因此物件丟擲的異常也有這三種區別。是在物件構造時丟擲的呢?還是物件執行時丟擲的呢?或是析構物件時丟擲的?這三種不同時候丟擲的異常會將會產生不同的結果。本文首先討論最常見的一種情況,在物件執行時丟擲的異常,也即執行物件的成員函式時出現的異常。
物件的成員函式丟擲的異常
1、老方法,看例子先,如下:
class mytest_base
void other() {}
protected:
string m_name;
};void main()
catch(std::exception e)
catch(...)
}c++程式設計師不難看出上面的程式的執行結果,如下:
構造乙個mytest_base型別的物件,物件名為:obj1
銷毀乙個mytest_base型別的物件,物件名為:obj1
故意丟擲乙個異常,測試!
從執行結果可以得出如下結論:
(1) 物件的成員函式出現異常時,catch block能捕獲到異常,這一點就像c語言中的普通函式一樣,沒什麼特別的地方;
(2) 物件的成員函式出現異常時,物件的析構函式將會得到執行(這一點很神奇吧!當然在這裡不會做過多研究,在剖析c++異常處理模型的實現時再做詳細的闡述),這裡與c++標準中規定的物件導向的特性是相一致的,構造了的物件就必須保證在適當的地方要析構它,以釋放可能的資源。因此前面說的「c++異常處理模型對物件導向提供了支援和相容」是有根據的。而且注意它的析構函式是在異常處理模組之前執行的,這一點更與c++標準中規定的物件導向的特性是一致的,當物件出了作用域時,它就必須要被析構。
2、把上面的程式小改一下,執行再看結果,如下:
void main()
catch(std::exception e)
catch(...)
}上面的程式也難看出其執行結果,如下:
構造乙個mytest_base型別的物件,物件名為:obj1
構造乙個mytest_base型別的物件,物件名為:obj2
構造乙個mytest_base型別的物件,物件名為:obj3
銷毀乙個mytest_base型別的物件,物件名為:obj3
銷毀乙個mytest_base型別的物件,物件名為:obj2
故意丟擲乙個異常,測試!
銷毀乙個mytest_base型別的物件,物件名為:obj1
結合程式中提出的問題和執行結果,可以又可得出如下結論:
(1) 在成員函式出現異常時,同乙個作用域中異常出現點後面還未來得及構造的物件將不會被構造,當然也不會被析構;
(2) 在成員函式出現異常時,同乙個作用域中異常出現點前面已經構造的物件也同樣會被析構(這是不是更神奇了!)。因此這也顯現出c++異常處理不會破壞c++標準中規定的物件導向的特性,當物件出了作用域時,它就必須要被析構,即便它自己本身沒出現異常,總之不管是正常的執行過程導致物件退出了作用域,還是其它物件執行時發生了異常而導致自己退出了作用域;
(3) 在成員函式出現異常時,未被影響到的其它作用域中的物件將保持自己原來的執行流程。
物件的成員函式丟擲的異常時概括性總結
哈哈^-^,其是就只有一句話,那就是「c++的異常處理不會破壞任何一條物件導向的特性!」,因此主人公阿愚建議大家其實無須要記住上面總結的n條結論,記住這一條足矣!
建構函式中丟擲的異常
建構函式中丟擲的異常 1 標準c 中定義建構函式是乙個物件構建自己,分配所需資源的地方,一旦建構函式執行完畢,則表明這個物件已經誕生了,有自己的行為和內部的執行狀態,之後還有物件的消亡過程 析構函式的執行 可誰能保證物件的構造過程一定能成功呢?說不定系統當前的某個資源不夠,導致物件不能完全構建好自己...
建構函式中丟擲的異常
標準c 中定義建構函式是乙個物件構建自己,分配所需資源的地方,一旦建構函式執行完畢,則表明這個物件已經誕生了,有自己的行為和內部的執行狀態,之後還有物件的消亡過程 析構函式的執行 可誰能保證物件的構造過程一定能成功呢?說不定系統當前的某個資源不夠,導致物件不能完全構建好自己。物件總是由不斷的繼承或不...
建構函式中丟擲的異常
建構函式中丟擲的異常 1 標準c 中定義建構函式是乙個物件構建自己,分配所需資源的地方,一旦建構函式執行完畢,則表明這個物件已經誕生了,有自己的行為和內部的執行狀態,之後還有物件的消亡過程 析構函式的執行 可誰能保證物件的構造過程一定能成功呢?說不定系統當前的某個資源不夠,導致物件不能完全構建好自己...