試了下 Golang 裡面寫個 try catch

如果❤️我的文章有幫助,歡迎點贊、關注。這是對我繼續技術創作最大的鼓勵。

更多往期文章在我的個人專欄[1]

試了下 Golang 裡面寫個 try catch

前言

Golang語言有諸多優點:靜態編譯、協程、堪比c語言的高效能。 但是也有一些令人髮指的地方 —— 經常被人調侃

五行程式碼,三行錯誤處理

的異常錯誤處理方式,如下問題出現的地方

func readFile(path string) ([]byte, error) { file, err := os。Open(path) if err != nil { return nil, err } defer file。Close() return ioutil。ReadAll(file)}

函式

readFile

的功能是讀出指定檔案本身的內容並將其返回,同時當有錯誤發生時立即向呼叫方報告。 根據Golang程式設計正規化,每個可能導致錯誤的函式都應該將

error

作為最後一個返回值,所以Golang程式碼中隨處都是“if err != nil”語句。

五行程式碼,三行錯誤處理

的調侃段子由此在圈內流行

能不能 try catch

我之前常用程式語言 Python 和 PHP 的時候,早已經習慣

try catch

處理異常的方式。於是對 Golang

使用流程控制 配合 panic()、recover() 一直耿耿於懷

,為了以後舒服今天就來實現一下原來

try catch

異常錯誤處理方式

Golang 語言中擁有

recover()

函式作為

宕機恢復機制

,讓程式在宕機流程中的 goroutine 中恢復。

所以我們能夠用

recover()

函式作為程式中是否出現的

鉤子

。當出現異常時,由它調起我們的異常處理函式。首先簡單實現以下:

package mainimport “fmt”func try(userFn func()) { defer func() { if err := recover();err != nil{ fmt。Printf(“程式執行發生異常: %v\n”, err) } }() userFn()}func foo(num int) { if num < 10 { panic(“number is less than 10”) }else { panic(“number is greater than 10”) }}func main() { try(func() { foo(9) }) try(func() { foo(11) })}

go run main。go

執行:

$ go run _test/demo3/test3。go程式執行發生異常: number is less than 10程式執行發生異常: number is greater than 10

從上可以看出,

recover()

函式完成我們

讓它作為鉤子

,的作用,調起了列印

程式執行發生異常

的資訊。

加入處理異常方法

捕抓到異常還需要處理異常,而不是簡單列印

程式執行發生異常

。所以還需要增加匿名方法作為

異常處理方法

,改造如下:

func try(userFn func(), catchFn func(err interface{})) { defer func() { if err := recover();err != nil{ catchFn(err) } }() userFn()}。。。func main() { try(func() { foo(9) }, func(err interface{}) { fmt。Printf(“程式執行發生異常: %v\n”, err) }) try(func() { foo(11) }, func(err interface{}) { fmt。Printf(“程式執行發生異常: %v\n”, err) })}

這樣就可以隨心所欲傳入

自定義處理異常的方法

總結

以上只是自己簡單實現了

try catch

,其中還有很多缺陷,比如:不支援

finally

函式處理,

try catch

封裝過於簡單。這裡拋磚引玉,後續接著改進

References

[1] 更多往期文章在我的個人專欄:

https://coderdao。github。io/