基礎知識
例外處理機制有兩個主要成分:例外的鑒定和發出,以及例外的處理方式,通常,不論是membe function和non-member function,都有可能產生例外以及處理例外,例外出現后,正常程式的執行便被暫停(suspended),與此同時,例外處理機制開始搜索程式中有能力處理這一例外的地點,例外被處理完畢之后,程式的執行便會繼續(resume),從例外處理點接著執行下去,
所謂例外(exception)是某種物件,最簡單的例外物件可以設計為整數或字串,大部分時候,被拋出的例外都屬于特定的例外類(也許形成一個繼承體系),
我們可以利用單潭訓一連串的catch字句來捕獲(catch)被拋出的例外物件,catch子句有三部分組成:關鍵字catch、小括號內的一個型別或物件、大括號內的一組陳述句(用以處理例外),拋出的例外物件型別會被拿來逐一地和每個catch子句比對,如果型別符合,那么該catch子句的內容便會被執行,在通過所有catch子句之后,由正常程式重新接手,有時我們可能無法完成例外的完整處理程序,在記錄資訊之外,我們或許需要重新拋出(rethrow)例外,以尋求其它catch子句的協助,做進一步的處理,重新拋出時,只需寫下關鍵字throw即可,它只能出現于catch子句中,它會將捕獲的例外物件再一次拋出,并由另一個型別符合的catch子句接手處理,如果我們想要捕獲任何型別的例外,可以使用一網打盡(catch-all)的方式,只需在例外宣告部分指定省略號(…)即可,
catch子句應該和try塊相應而生,try塊是以關鍵字try作為開始,然后是大括號內的一連串程式陳述句,catch子句放在try塊的末尾,這表示如果try塊內有任何例外發生,便由接下來的catch子句加以處理,
當函式的try塊發生某個例外,但并沒有相應的catch子句將它捕獲,此函式便會被中斷,由例外處理機制接管,沿著“函式呼叫鏈”一路回溯,搜尋符合條件的catch子句,如果“函式呼叫鏈”不斷被解開,一直回到main()還是找不到合適的catch子句,變呼叫標準庫提供的terminate()——其默認行為是中斷整個程式的執行,
練習題答案
練習7.3 為練習5.2的Stack類體系加入兩個例外型別,處理“想從空stack中取出元素”和“想為滿stack添加元素”兩種錯誤,請顯示修改后的pop()和push(),
定義PopOnEmpty和PushOnFull兩個例外類,分別供pop()和push()拋出,于是,Stack的所有member function就不再需要回傳代表成功或失敗的值了:
void pop(elemType& elem) { if (empty()) throw PopOnEmpty; elem = _stack[--_top]; _stack.pop_back(); } void push(const elemType& elem) { if (!full()) { _stack.push_back(elem); ++_top; return; } throw PushOnFull(); }
為了讓這兩個Stack例外可以被完全不知情的其它組件捕獲,它們應該融入StackException繼承體系中,后者又應該派生自標準庫所提供的logic_error class,
logic_error派生自exception,exception是標準庫的所有例外類別繼承體系的最根本抽象基類,這個繼承體系有一個名為what()的虛函式,會回傳const char*,用以表示被捕獲的例外究竟為何,
class StackException :public logic_error { public: StackException(const char* what) :_what(what) {} const char* what() const { return _what.c_str(); } protected: string _what; }; class PopOnEmpty :public StackException { public: PopOnEmpty() :StackException("Pop on Empty Stack") {} }; class PushOnFull :public StackException { public: PushOnFull() :StackException("Push on Full Stack") {} };
以下任何一個catch子句都能夠處理型別為PushOnFull的例外:
catch (const PushOnFull & pof) { log(pof.what()); return; } catch (const StackException & stke) { log(stke.what()); return; } catch (const logic_error & lge) { log(lge.what()); return; } catch (const PushOnFull & ex) { log(ex.what()); return; }
end,
“A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better.”
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61729.html
標籤:C++
上一篇:Dijkstra演算法2
下一篇:C++_快速排序
