如果❤️我的文章有幫助,歡迎點贊、關注。這是對我繼續技術創作最大的鼓勵。
更多往期文章在我的個人專欄[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/