STL學習小計(四) C 異常處理

2021-10-19 17:32:00 字數 1548 閱讀 4283

double

divide

(int x,

int y)

throw

(int

,char

,float

)//介面異常宣告

return x / y;

}int

main()

catch

(int

)//根據型別匹配,int匹配int

/* catch (int a)//也可以直接接過丟擲的資料

catch (...)//捕獲所有異常

*/}

注意:假設函式呼叫棧:main() >> test01() >> divide(),最裡面的divide若丟擲了異常,則異常會出現在test01(),若test01中沒有對應的catch捕獲,則會沿著函式呼叫棧繼續往上丟擲,直到被catch捕獲。如果到頂層main都沒有被處理,就會因為程式錯誤被系統捕獲,從而導致程式掛掉。

更改divide()如下:

double

divide

(int x,

int y)

return x / y;

}

在丟擲異常的同時,從進入 try 塊起,到異常被拋擲前,這期間在棧上的構造的所有物件, 都會被自動析構。析構的順序與構造的順序相反。這一過程稱為棧的解旋。

對了這裡提一下,vs2017對於 char* 有一些奇奇怪怪的要求,如下,實測在linux下不加const也可以執行,不過有warning。

char

*s =

"asd"

;// 不行!

const

char

*s =

"asd"

;// 行!

自定義異常類:

class

myexception

;void

log(

)public

:char

*message;};

//使用

intdivide

(int x,

int y)

return x / y;

}int

main()

catch

(myexception e)

}

注意:這樣的**有問題:

在執行 divide()函式中的 throw myexception(「除數為0」) 時,會生成乙個匿名物件,同時把這個匿名物件作為錯誤丟擲到上一層,此時會執行兩個操作:

1、在上一層的catch中,隱含有myexception e = 匿名物件這是乙個拷貝構造操作,因為並未過載拷貝構造,所以此時e裡面的 message 指標指向的區域和匿名物件的 message 指標一樣;

2、divide丟擲異常後,會析構建立的匿名物件,此時 匿名物件的message 所指區域被釋放,**但 e的message 仍指向那片區域**,因此會報錯

解決方法:

過載拷貝構造和=操作符

異常處理小計

面向介面程式設計 程式中的骨架 主體 使用介面設計 一流公司定規則 sun,二流公司玩概念 mysql 三流公司出產品 final 1.修飾變數 常量。2.修飾方法 該方法不能被子類重寫。3.修飾類 不能被繼承。static 修飾方法 例如 public static string aa 通過 類名...

C 高階STL 異常處理

1 可以丟擲 int char float型別的異常,不可以拋其他型別的異常 void fun1 throw int char float 2 不可以丟擲任何異常 void fun2 throw 3 可以丟擲任何異常 void fun2 4 異常捕獲 trycatch 三個點表示捕獲所有異常 cla...

C 學習入門(四) 異常和異常的處理

2.異常處理 3.總結 在程式設計和執行中,不可避免的會出現各種各樣的錯誤,為了減少設計程式中的錯誤,一般採用兩種解決方案 1 在程式設計階段,使用除錯程式找出程式中的錯誤並改正。2 在程式中加入異常處理的語句,從而使得程式具有容錯功能。程式的錯誤分為以下3種 1 語法錯誤。如果使用了錯誤的語法 函...