C 之異常總結篇

2021-09-23 10:43:45 字數 1870 閱讀 4250

程式結束的方式:

1、正常結束 ----- main最後一條語句 -------return 0;

2、異常結束:

1.自殺:自己把自己結束

int div(int left,int right)

2.他殺:delay將程式殺死

c語言中傳統處理異常的方式:

終止程式,如if、assert,缺陷:使用者難以接受。如發生記憶體錯誤,除0錯誤時就會終止程式。

返回錯誤碼:

缺陷:需要程式設計師自己去查詢對應的錯誤。如系統的很多庫的介面函式都是通過把錯誤碼放到errno中,表示錯誤

c 標準庫中setjmp和longjmp組合。這個不是很常用,實際中c語言基本都是使用返回錯誤碼的方式處理錯誤,部分情況下使用終止程式處理非常嚴重的錯誤。

:雖然goto語言看似是處理異常事件的更可行方案,不幸的是,goto是本地的:它只能跳到所在函式內部的標號上,而不能將控制權轉移到所在程式的任意地點(當然,除非你的所有**都在main體中)。

jmp_buf buff;

//定義結構體型別的變數

void

testfunc1()

fclose

(file);}

void

testfunc2()

free

(p);

}int main()

else

}system

("pause");

return0;

}

c++中的異常概念:異常是一種處理錯誤的方式,當乙個函式發現自己無法處理的錯誤時就可以丟擲異常,讓函式的直接或間接呼叫處理這個錯誤。

//try&catch使用方式。

trycatch

(exceptionname e1 )

catch

( exceptionname e2 )

catch

( exceptionname en )

異常的丟擲和匹配原則

異常是通過丟擲物件而引發的,該物件的型別決定了應該啟用哪個catch的處理**。

被選中的處理**是呼叫鏈中與該物件型別匹配且離丟擲異常位置最近的那乙個。

丟擲異常物件後,會生成乙個異常物件的拷貝,因為丟擲的異常物件可能是乙個臨時物件(副本),所以會生成乙個拷貝物件,這個拷貝的臨時物件會在被catch以後銷毀。(這裡的處理類似於函式的傳值返回)

catch(…)可以捕獲任意型別的異常,問題是不知道異常錯誤是什麼。

實際中丟擲和捕獲的匹配原則有個例外,並不都是型別完全匹配,可以丟擲的派生類物件,使用基類捕 獲,這個在實際中非常實用.

如果丟擲異常的型別,是陣列型別,則捕獲時捕獲陣列首位址

異常安全

異常規範

異常規格說明的目的是為了讓函式使用者知道該函式可能丟擲的異常有哪些。 可以在函式的後面接 >throw(型別),列出這個函式可能拋擲的所有異常型別。

eg:void testfunc()throw(int,double) //只接受int和double型別的異常

函式的後面接throw(),表示函式不拋異常。

但是在vs中並不支援異常規範,linux系統支援若無異常介面宣告,則此函式可以拋擲任何型別的異常。

異常的優缺點

java基礎篇之異常處理

概述 checked異常體系 unchecked 所有的runtimeexception 及其子類 統稱 runtime異常,例如arrayindexoutofbound ception,nullpointerexception,這樣的異常,也可以不處理。對於這些異常,我們應該修正 而不是去通過異常...

基礎知識之 異常篇

異常 throwable 體系頂端 分支 error 和 runtimeexception 出現異常 為編譯時異常 和執行時異常 編譯時異常 在idea上都直接報錯了 不讓你執行 執行時異常 jvm處理某個方法 方法 比如索引越界 那麼jvm檢測出異常 會生成異常物件 內容,位置,時間 然後會把這個...

SpringBoot實戰 之 異常處理篇

在網際網路時代,我們所開發的應用大多是直面使用者的,程式中的任何一點小疏忽都可能導致使用者的流失,而程式出現異常往往又是不可避免的,那該如何減少程式異常對使用者體驗的影響呢?其實方法很簡單,對異常進行捕獲,然後給予相應的處理即可。但實現的方式卻有好多種,例如 try catch exception ...