C 語言學習記錄 31 異常處理

2021-10-19 12:09:00 字數 2851 閱讀 2154

異常處理是一種錯誤處理機制,提高了c++程式的安全性,在團隊開發過程中,可以通過異常處理機制降低產生錯誤的可能性,從而提高程式的可靠性。

c++中異常往往使用類進行實現,以棧滿或空的異常為例

class

poponemtpy

;class

pushonfull

;template

<

typename t>

void stack

::push

(const t&data)

template

<

typename t>t stack

::pop()

c++要求丟擲的必須是物件,所以必須要有括號,即呼叫建構函式建立乙個物件。異常並不僅僅只有類物件,throw表示式也可以丟擲任何型別的物件,比如列舉、整數等等,但一般最常用類物件。

在異常作用域內,被new出來的物件或是變數在丟擲異常時不會自動被釋放,所以在丟擲異常前需要手動將其釋放

c++中,使用try/catch語句將可能存在的異常丟擲並捕獲,使用throw關鍵字做到丟擲異常的過程。

當throw物件(變數)引用時,拷貝的是引用的物件,而不只是拷貝引用名稱

而try/catch語句的使用方式是

try

catch(型別名[形參名])

以下事例是判斷三條邊能不能構成三角形的程式

#include

#include

using

namespace std;

double

sqrt_delta

(double d)

double

delta

(double a,

double b,

double c)

void

main()

catch

(int)}

}

如果在throw後面有表示式,則會拋出新的異常物件

#include

using

namespace std;

void

fun(

int x)

catch

(int

)catch

(double

) cout <<

"testing exception in fun()"

<< endl;

}void

gun(

)catch

(char

) cout <<

"testing exception in gun()"

<< endl;

}int

main()

testing exception in fun()

testing exception in gun()

首先定義了乙個fun函式,在該函式中做出判斷,根據不同的情況丟擲不同的異常,之後定義了乙個gun函式,在該函式中呼叫了上乙個fun函式,並又將異常重新丟擲一次。

主函式中,呼叫了gun函式,並丟擲了異常,gun呼叫了fun,fun的異常丟擲一次,接著gun進行丟擲

因為不知道可能被丟擲的全部異常,所以不是為每一種可能的異常都寫乙個catch以釋放資源,而是以通用形式的catch字句,即catch_all

catch(...)
任何異常都會進入這個catch字句,花括號中的復合語句用來執行制定操作,當然包括了資源的釋放

捕獲到的物件只是被丟擲物件的乙個副本,丟擲異常之後原物件就會被自動析構,也就是釋放

#include

using

namespace std;

intmain()

catch(.

..)system

("pause");

return0;

}

try模組中丟擲了乙個異常,也就是0.5,在捕獲異常的時候,才用了捕獲全部異常,並且經過處理,輸出了一段文字

catch_all的字句可以單獨使用,也可以與其他catch字句聯合使用。如果聯合使用,它必須放在相關catch子句表的最後,因為catch子句被檢查的順序與書寫順序相同,找到了乙個匹配之後,後續的catch子句就形同虛設,catch_all子句可以處理所有的異常,如果放在前面,則配合使用的其他字句就不能發揮作用

在c++中,大多數情況下報告和處理邏輯錯誤和執行時錯誤的首選方式都是使用異常。當堆疊可能包含一些在可檢測錯誤的函式和具有上下文來了解如何解決該錯誤的函式間的函式呼叫時,更是如此。異常就提供正式且定義完善的**錯誤的檢測方法,以在呼叫堆疊上向上傳遞資訊

程式錯誤通常分為兩類,第一類是程式設計錯誤導致的邏輯錯誤,第二類是超出程式設計師控制的執行時錯誤,比如網路不可用

出現異常時,c++會做以下幾種處理

1.異常強制呼叫**,識別錯誤條件並對其進行處理。若有未經處理的異常會終止程式執行

2.異常跳轉到能處理錯誤的呼叫堆疊的點

3.在引發異常後,異常堆疊展開結構基於顯式定義的規則銷毀處於控制範圍的所有物件

4.異常將介於檢測錯誤和處理錯誤間的**完全分離

注意:丟擲異常沒有捕獲會發生什麼

如果丟擲的異常一直沒有函式捕獲,則會一直上傳到c++執行系統,導致程式終止

異常處理通過什麼進行匹配

異常處理僅僅通過型別而不是值來進行匹配。所以catch塊的引數可以沒有引數名稱,只需要引數型別

異常丟擲後資源如何釋放

一般在異常丟擲後資源可以正常被釋放,但注意如果在類的建構函式中丟擲異常,系統是不會呼叫它的析構函式的

C語言學習要點記錄

1.運算的優先順序 算數 關係 邏輯 賦值 逗號運算子 2.複製是程式不良的表現 因為一旦乙個地方有變動要在很多地方修改 3.程式設計的過程中最好使用單一出口 4.本地變數在定義的時候不會預設初始化,引數在定義的時候一定要初始化 5.本地變數的生存期和作用域在定義的塊內 6.程式這次執行正常下次執行...

C語言學習記錄(序)

適用於超級新手小白,自學者,勿噴,謝。為什麼?據我所了解,c語言很適合打基礎,能幫助大多數想要學習其他語言的程式設計師快速入門,並且它適用於大多數平台,相容性很強。所以,經過很長一段時間的考慮和探索,我放棄了原本想要學習的python 網上說比較簡單,且能快速入門 準備學習c語言,這有利於打下基礎。...

C語言學習記錄4

c語言入門 關於形參和實參的說明 1 在定義函式中指定的形參,在未出現函式呼叫時,他們並不占用記憶體中的儲存單元,只有發生呼叫時,才會分配記憶體。2 實參可以是常量 變數或者表示式 有時傳遞的時位址 3 在被定義中,形參必須指定型別 4 實參與形參的型別應相同或賦值相容 5 c語言規定,實參變數對形...