Golang 處理錯誤,panic defer PK try catch 機制
阿新 • • 發佈:2018-12-15
go 語言使用 panic defer 機制處理錯誤,但可能你喜歡使用 try catch 機制。因此,需知道兩種機制之間的關係。演示程式碼如下:
package main
import (
"errors"
"fmt"
)
var (
internalError = errors.New("Don't need send out")
KnowError = errors.New("Excepted error!")
)
func main() {
fmt.Println("Hello, 世界")
//use `func() {}()` wrap try catch final blocks
v, e := func() (v int, e error) {
defer func() { //just like catch block
if r := recover(); r != nil {
e, _ = r.(error)
switch e {
case internalError:
// do something here, such as:
v += 5
e = nil
case KnowError:
fmt.Println(KnowError)
default:
panic(r)
}
}
}()
defer func() {}() //just like finally block
//try bock
v = 10
//panic(internalError)
//panic(KnowError)
//panic(errors.New("? Error"))
v += 10
return
}()
fmt.Println("output = ",v, e)
}
- 用一個內部匿名函式包裝 try塊。如果函式有結果返回,務必使用預定義返回變數方式!
- 匿名函式內先 defer 一個函式處理 catch,使用上述程式函式模板
- 匿名函式內先 defer 一個函式處理 finally
try 塊沒有錯誤輸出:
Hello, 世界
output = 20 <nil>
try 塊出現 internalError 錯誤,輸出:
Hello, 世界
output = 15 <nil>
try 塊出現 KnowError 錯誤,輸出:
Hello, 世界
output = 10 Excepted error!
try 塊出現 未知 錯誤,輸出:
Hello, 世界
panic: ? Error [recovered]
panic: ? Error
goroutine 1 [running]:
main.main.func1.1(0xc42004def8, 0xc42004def0)
/tmp/compile62.go:29 +0x1c8
... ...
結論:go 函式太強大,能自由完成各種複雜錯誤處理要求,但語法就比使用 try 機制的隱晦一些!