【go筆記】錯誤處理
阿新 • • 發佈:2021-11-20
go語言學習筆記之錯誤處理
前言
類似於try...catch...finally
,go語言的錯誤處理機制是用defer
、panic
和recover
。
在Go語言中,錯誤和異常有error
和panic
兩種。error
一般是程式開發者預知的,會進行適當的處理,比如檢測使用者輸入不合法,丟擲一個error
錯誤。panic
是程式開發者無法預知的異常,比如引用的物件值為空。
error
Go語言提供了兩種建立error
的方法,它們底層是一樣的,只是一種帶格式,一種不帶格式。
errors.New
fmt.Errorf
示例:
func ErrorUsage() { err := errors.New("err: found 1") if err != nil { fmt.Println(err.Error()) } err2 := fmt.Errorf("err: %s", "found 2") if err2 != nil { fmt.Println(err2.Error()) } }
示例程式碼:計算倒數
package main import ( "errors" "fmt" ) func reciprocal(n int) (float64,error) { // 計算倒數 if n == 0 { return 0,errors.New("0不能為倒數") } return float64(1) / float64(n), nil } func main() { for i := 3;i >= 0;i-- { ret,err := reciprocal(i) // 對於函式返回值有錯誤error的情況下,要先判斷一下函式有沒有error。 // 如果有error,就把錯誤資訊列印到控制檯,否則輸出計算得到的倒數值 if err != nil { fmt.Println(err) } else { fmt.Printf("1/%d = %.3f\n",i,ret) } } }
error
作為函式的返回值,應放在返回值型別列表的末尾。
panic
在沒有recover
的情況下,panic
常常會導致程式崩潰。
示例程式碼
package main import ( "fmt" ) func doPanic() { // doPanic: 當捕獲panic異常時觸發 // 呼叫內建的recover()捕獲panic異常 err := recover() if err != nil { // runtime error: integer divide by zero fmt.Println("doPanic()捕獲到異常:", err) } } func main() { // 註冊捕獲異常的處理函式 defer doPanic() n := 0 ret := 1 / n // 出現異常後,下面語句不會執行列印 fmt.Println("main ret = ",ret) }
- 在
Go
語言中,recover
只在defer
呼叫的函式中有效,並且defer
要先註冊,否則不能捕獲到panic
異常。