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