前言:
Go 語言追求簡潔優(yōu)雅,所以,Go 語言不支持傳統(tǒng)的 try…catch…finally
這種處理。
Go 中引入的錯(cuò)誤處理方式為:defer, panic, recover,也僅僅是錯(cuò)處處理的模擬
Go語言的作者認(rèn)為java等語言的錯(cuò)誤處理底層實(shí)現(xiàn)較為復(fù)雜,就實(shí)現(xiàn)了函數(shù)可以返回錯(cuò)誤類型以及
簡單的異常捕獲,雖然簡單但是也非常精妙,大大的提高了運(yùn)行效率。
一、error變量可以做什么
1.定義一個(gè)error變量
①直接new一個(gè)
err := errors.New("我是錯(cuò)誤處理語句")
②實(shí)現(xiàn)Error接口
只要實(shí)現(xiàn)了Error接口就可以被error類型所接收,打印的時(shí)候會(huì)直接打印實(shí)現(xiàn)接口時(shí),方法返回的字符串。
官方接口如下:
1
2
3
|
type error interface { Error() string } |
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// 定義一個(gè)結(jié)構(gòu)體 type man struct { age int } // 實(shí)現(xiàn)接口 func (a man ) Error() string { str := "這是一個(gè)錯(cuò)誤接口" return str } // 創(chuàng)建函數(shù)返回錯(cuò)誤類型 func judgeAge() (int, error) { var a man return 0, a } // 主函數(shù)調(diào)用 func main() { _, e := judgeAge() if e!=nil{ fmt .Println(e) } } |
2.錯(cuò)誤的處理
將如果錯(cuò)誤變量不為空,則將錯(cuò)誤進(jìn)行捕獲打印,這里直接打印到了控制臺(tái),可以將錯(cuò)誤打印到日志文件內(nèi),為以后系統(tǒng)的維護(hù)做保障。
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package main import ( "errors" "fmt" ) func main() { err := errors.New( "我是錯(cuò)誤處理語句" ) if err != nil { fmt .Println(err) } else { fmt .Println( "沒有錯(cuò)誤" ) } fmt .Println(123) } |
3.做函數(shù)返回值
- 如果函數(shù)返回的錯(cuò)誤類型值不為空,則將其進(jìn)行打印
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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ù)
一般用作處理錯(cuò)誤變量,在需要進(jìn)行錯(cuò)誤檢驗(yàn)的時(shí)候調(diào)用函數(shù),不用再進(jìn)行判斷了
代碼如下:
1
2
3
4
5
|
func PrintError(err error){ if err!=nil{ fmt .Println(err) } } |
二、模擬異常的捕獲與拋出
1.defer簡介
defer
后面定義的東西是在調(diào)用函數(shù)執(zhí)行完的時(shí)候執(zhí)行的代碼,一般用于文件描述符、數(shù)據(jù)庫對(duì)象的關(guān)閉(在之前講管道的時(shí)候有介紹過)
defer什么什么延時(shí)執(zhí)行
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
func pDefer() { defer fmt .Println( "hahaha" ) fmt .Println( "hello" ) } func main() { pDefer() } /* 打印結(jié)果 hello hahaha */ |
2.使用recover模擬異常的捕獲
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package main import ( "fmt" ) func test () { // 使用defer + recover 來捕獲和處理異常(返回錯(cuò)誤變量) // 函數(shù)執(zhí)行末尾執(zhí)行這個(gè)匿名函數(shù) defer func() { err := recover() // recover()內(nèi)置函數(shù),可以捕獲到異常 if err != nil { // 說明捕獲到錯(cuò)誤 fmt .Println(err) } }() num1 := 10 num2 := 0 res := num1 / num2 fmt .Println( "計(jì)算結(jié)果為=" , res) } func main() { test () } |
3.使用panic主動(dòng)拋出錯(cuò)誤
異常的捕獲,使程序還能夠正常的運(yùn)行,如果有致命錯(cuò)誤就需要進(jìn)行錯(cuò)誤的拋出了,也就是宕機(jī),不到迫不得已千萬不要使用這個(gè)函數(shù),有可能會(huì)造成大量數(shù)據(jù)的丟失
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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ù)使一個(gè)interface接口 } |
運(yùn)行結(jié)果:
總結(jié):
Go語言雖然沒有一個(gè)較為成熟的異常捕獲機(jī)制,但是其精簡的錯(cuò)誤處理仍舊能夠滿足其需求,減少錯(cuò)誤的處理大大的加快了我們的開發(fā)效率,代碼的運(yùn)行效率。
到此這篇關(guān)于Go語言錯(cuò)誤處理異常捕獲+異常拋出的文章就介紹到這了,更多相關(guān)Go語言異常捕獲和異常拋出內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/apple_51931783/article/details/122573931