Go語言錯誤處理異常捕獲+異常拋出
前言:
Go 語言追求簡潔優(yōu)雅,所以,Go 語言不支持傳統(tǒng)的 try…catch…finally
這種處理。
Go 中引入的錯誤處理方式為:defer, panic, recover,也僅僅是錯處處理的模擬
Go語言的作者認(rèn)為java等語言的錯誤處理底層實(shí)現(xiàn)較為復(fù)雜,就實(shí)現(xiàn)了函數(shù)可以返回錯誤類型以及
簡單的異常捕獲,雖然簡單但是也非常精妙,大大的提高了運(yùn)行效率。
一、error變量可以做什么
1.定義一個error變量
①直接new一個
err := errors.New("我是錯誤處理語句")
②實(shí)現(xiàn)Error接口
只要實(shí)現(xiàn)了Error接口就可以被error類型所接收,打印的時候會直接打印實(shí)現(xiàn)接口時,方法返回的字符串。
官方接口如下:
type error interface { ? ? Error() string }
代碼如下:
//定義一個結(jié)構(gòu)體 type man struct { ?? ?age int } //實(shí)現(xiàn)接口 func (a man) Error() string { ?? ?str := "這是一個錯誤接口" ?? ?return str } //創(chuàng)建函數(shù)返回錯誤類型 func judgeAge() (int, error) { ?? ?var a man ?? ?return 0, a } //主函數(shù)調(diào)用 func main() { ?? ?_, e := judgeAge() ?? ?if e!=nil{ ?? ??? ?fmt.Println(e) ?? ?} }
2.錯誤的處理
將如果錯誤變量不為空,則將錯誤進(jìn)行捕獲打印,這里直接打印到了控制臺,可以將錯誤打印到日志文件內(nèi),為以后系統(tǒng)的維護(hù)做保障。
代碼如下:
package main import ( ?? ?"errors" ?? ?"fmt" ) func main() { ?? ?err := errors.New("我是錯誤處理語句") ?? ?if err != nil { ?? ??? ?fmt.Println(err) ?? ?}else { ?? ??? ?fmt.Println("沒有錯誤") ?? ?} ?? ?fmt.Println(123) }
3.做函數(shù)返回值
- 如果函數(shù)返回的錯誤類型值不為空,則將其進(jìn)行打印
代碼如下:
package main import ( ?? ?"errors" ?? ?"fmt" ) func test(num1,num2 int) error { ?? ?if num2 == 0 { ?? ??? ?return errors.New("除數(shù)為零") ?? ?} ?? ?res := num1 / num2 ?? ?fmt.Println("計(jì)算結(jié)果為=", res) ?? ?return nil } func main() { ?? ?err := test(11,0) ?? ?if err!=nil{ ?? ??? ?fmt.Println(err) ?? ?} }
4.做函數(shù)參數(shù)
一般用作處理錯誤變量,在需要進(jìn)行錯誤檢驗(yàn)的時候調(diào)用函數(shù),不用再進(jìn)行判斷了
代碼如下:
func PrintError(err error){ ?? ?if err!=nil{ ?? ??? ?fmt.Println(err) ?? ?} }
二、模擬異常的捕獲與拋出
1.defer簡介
defer
后面定義的東西是在調(diào)用函數(shù)執(zhí)行完的時候執(zhí)行的代碼,一般用于文件描述符、數(shù)據(jù)庫對象的關(guān)閉(在之前講管道的時候有介紹過)
defer什么什么延時執(zhí)行
代碼如下:
func pDefer() { ?? ?defer fmt.Println("hahaha") ?? ?fmt.Println("hello") } func main() { ?? ?pDefer() } /* 打印結(jié)果 ?? ?hello ?? ?hahaha */
2.使用recover模擬異常的捕獲
代碼如下:
package main import ( ?? ?"fmt" ) func test() { ?? ?//使用defer + recover 來捕獲和處理異常(返回錯誤變量) ?? ?//函數(shù)執(zhí)行末尾執(zhí)行這個匿名函數(shù) ?? ? defer func() { ?? ? ?? ?err := recover() // recover()內(nèi)置函數(shù),可以捕獲到異常 ?? ? ?? ?if err != nil { ?//說明捕獲到錯誤 ?? ? ?? ??? ?fmt.Println(err) ?? ? ?? ?} ?? ? }() ?? ?num1 := 10 ?? ?num2 := 0 ?? ?res := num1 / num2 ?? ?fmt.Println("計(jì)算結(jié)果為=", res) } func main() { ?? ?test() }
3.使用panic主動拋出錯誤
異常的捕獲,使程序還能夠正常的運(yùn)行,如果有致命錯誤就需要進(jìn)行錯誤的拋出了,也就是宕機(jī),不到迫不得已千萬不要使用這個函數(shù),有可能會造成大量數(shù)據(jù)的丟失
代碼如下:
package main import ( ?? ?"errors" ?? ?"fmt" ) func test() error { ?? ?num1 := 10 ?? ?num2 := 0 ?? ?if num2 == 0 { ?? ??? ?return errors.New("除數(shù)為零") ?? ?} ?? ?res := num1 / num2 ?? ?fmt.Println("計(jì)算結(jié)果為=", res) ?? ?return nil } func main() { ?? ?//無論err是否為空,都進(jìn)行程序的終止 ?? ? panic(test())//內(nèi)置函數(shù)2,參數(shù)使一個interface接口 }
運(yùn)行結(jié)果:
總結(jié):
Go語言雖然沒有一個較為成熟的異常捕獲機(jī)制,但是其精簡的錯誤處理仍舊能夠滿足其需求,減少錯誤的處理大大的加快了我們的開發(fā)效率,代碼的運(yùn)行效率。
到此這篇關(guān)于Go語言錯誤處理異常捕獲+異常拋出的文章就介紹到這了,更多相關(guān)Go語言異常捕獲和異常拋出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Makefile構(gòu)建Golang項(xiàng)目示例詳解
這篇文章主要為大家介紹了Makefile構(gòu)建Golang項(xiàng)目的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07golang切片擴(kuò)容規(guī)則實(shí)現(xiàn)
這篇文章主要介紹了golang切片擴(kuò)容規(guī)則實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03go內(nèi)存緩存如何new一個bigcache對象示例詳解
這篇文章主要為大家介紹了go內(nèi)存緩存如何new一個bigcache對象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09GO語言不固定參數(shù)函數(shù)與匿名函數(shù)的使用
本文主要介紹了GO語言不固定參數(shù)函數(shù)與匿名函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03