學習C++:異常處理
1.導致異常的原因
異常可能是外部因素導致的,如系統沒有足夠的內存;也可能是應用程序內部因素導致的,如使用的指針包含無效值或除數為零。為向調用者指出錯誤,有些模塊引發異常。
異常會打斷應用程序的正常流程。畢竟,如果沒有內存可用,應用程序就無法完成分配給它的任務。然而應用程序可處理這種異常:向用戶顯示一條友好的錯誤消息,采取必要的挽救措施并妥善地退出。
2.使用try和catch捕獲異常
要捕獲語句可能引發的異常,可將它們放在try塊中,并使用catch塊對try塊可能引發的異常進行處理,語法如下:
void Func() { try { int* pNumber = new int; *pNumber = 999; delete pNumber; } catch(...) { cout<<"Exception in Func, quiting"< 1 2 3 4 5 6 7 8 9 10 11 12 13 (1)使用catch(…)處理所有異常 成功分配內存時,默認形式的new返回一個指向該內存單元的有效指針,但失敗時引發異常。下面將演示如何捕獲使用new分配內存時可能引發的異常,并在計算機不能分配請求的內存時進行處理。 #include 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 在此程序中,如果鍵盤輸入的Input為一個負數,這顯然不符合要求。如果沒有異常處理,該程序將以討厭你的方式終止。但由于有異常處理程序,程序將顯示一條友好的消息:Got to end, sorry!結束程序。 (2)捕獲特定類型的異常 一般的異常的類型是已知的,為了查明導致異常的原因,執行更有針對性的清理工作,或者至少是向用戶顯示一條提示消息,這時就可以選擇捕獲這種類型的異常。 其實上面(1)中的程序,當鍵盤輸入指定存儲的個數為負數時,將導致引發異常,而該異常類型為std::bad_alloc。 下面程序將演示捕獲std::bad_alloc類型的異常: #include 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 3.使用throw引發特定類型的異常 在上面演示的程序中,捕獲std::bad_alloc時,實際上是捕獲new引發的std::bad_alloc類對象。你也可以引發自己選擇的異常,為此只需要使用關鍵字throw。語法如下: void Func() { if(case_unwanted) throw Value; } 當做除法運算時,若除數為0將導致程序異常。下面將演示如何使用throw引發這種自定義異常: #include 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 注意:上述代碼沒有將整個main()都放在try{}中,而只在其中包含可能引發異常的代碼。提倡這種做法,因為異常處理也可能降低代碼的執行性能。 4.std::exception類 捕獲std::bad_alllocl類型異常時,實際上是捕獲new引發的std::bad_alloc對象。std::bad_alloc繼承了C++標準類std::exception,而使用exception類時,需要添加頭文件:#include 從std::exception派生出來的幾個重要的異常類: bad_alloc: 使用new請求內存失敗時引發 bad_cast: 試圖使用dynamic_cast轉換錯誤類型時引發 ios_base::failure: 由iostream庫中的函數和方法引發 std::exception是異常基類,定義了虛函數what(),用來描述導致異常的原因。 因為std::exception是眾多異常類型的基類,所以所有將std::exception作為基類的異常,均可使用catch(const exception&)捕獲: void Func() { try { // code made exception safe } catch(const std::exception& exp) { cout<<"導致異常的原因是:"< 1 2 3 4 5 6 7 8 9 10 11 從std::exception派生出自定義異常類 讓自定義異常繼承std::exception的好處在于,現有的異常處理程序catch(const std::exception)不但能捕獲bad_alloc、bad_cast等異常,還能捕獲自定義異常,因為它們的基類都是exception。 下面將演示繼承std::exception的CustomException類: #include 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 C++
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。