Go中的異常處理


1. errors包

Go 有一個預先定義的 error 接口類型 :

type error interface {
	Error() string
}

錯誤值用來表示異常狀態。Go也提供了一個包:errors,errors 包中有一個 errorString 結構體實現了 error 接口 。任何時候當你需要一個新的錯誤類型,都可以用 errors包的 errors.New 函數接收合適的錯誤信息來創建 :

err := errors.New("so.this is a error test")

2. 運行時異常和panic

我們在代碼段中定義了一個error,這個error我們可以處理也可以不處理,它並不會影響程序繼續往下執行;但是如果在程序中定義了一個panic,那程序是一定不會往下執行。

panic所定義的異常,是在程序運行到這里才觸發,所以屬於運行時異常。

	fmt.Print("start....")
	panic("an error occured: stopping")
	fmt.Print("end")

輸出錯誤:

start....panic: an error occured: stopping

goroutine 1 [running]:
main.main()
	D:/workspace/go/demo/testError.go:11 +0x9d

另外,如果panic函數遇到了defer延遲函數,在defer函數中觸發了panic函數異常,會將該異常一直往上攜帶,一直輸送到這個協程的起點:

package main

import (
	"fmt"
)

func defer1()  {
	panic("an error occured: stopping")
	fmt.Println("defer1")
}

func defer2()  {
	defer1()
	fmt.Println("defer2")
}

func main() {
	fmt.Println("start....")
	defer defer2()
	fmt.Println("end")

}

輸出如下:

start....
end
panic: an error occured: stopping

goroutine 1 [running]:
main.defer1(...)
	D:/workspace/go/demo/testError.go:8
main.defer2()
	D:/workspace/go/demo/testError.go:13 +0x41
main.main()
	D:/workspace/go/demo/testError.go:22 +0xf7

可以看到異常信息一直被帶到了main函數中。

那么既然有拋出異常,自然也會有異常捕獲,recover就是這樣的一個函數。

3. recover

正如名字一樣,這個(recover)內建函數被用於從 panic 或 錯誤場景中恢復 。recover的使用方式是:必須的在defer修飾的方法中使用,不然不生效。原因你應該懂:panic拋出異常,defer具備延遲處理功能,所以最后這種兜底的活只能defer來做。

package main

import (
	"fmt"
	"log"
)

func defer1()  {
	panic("an error occured: stopping")
	fmt.Println("defer1")
}

func defer2()  {
	defer func() {
		if err := recover();err != nil{
			log.Printf("panic: v%",err)
		}
	}()
	defer1()
	fmt.Println("defer2")
}

func main() {
	fmt.Println("start....")
	defer2()
	fmt.Println("end")

}

輸出:

start....
end
2019/04/02 00:08:01 panic: v%!(NOVERB)%!(EXTRA string=an error occured: stopping)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM