1. 程式人生 > >Golang 處理錯誤,panic defer PK try catch 機制

Golang 處理錯誤,panic defer PK try catch 機制

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) }
  1. 用一個內部匿名函式包裝 try塊。如果函式有結果返回,務必使用預定義返回變數方式!
  2. 匿名函式內先 defer 一個函式處理 catch,使用上述程式函式模板
  3. 匿名函式內先 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 機制的隱晦一些!