golang中recover和panic用法

golang中沒有try... catch...,所以當golang中遇到panic時,如果不進行recover,便會導致整個程序掛掉,具體例子如下:

package main

import (
	"fmt"
)

func main() {
	panic("fault")
	fmt.Println("panic")
}
運行結果:
panic: fault
  
  goroutine 16 [running]:...

程序掛掉,並且報告出錯的地方,並打印出掉用的棧


解決辦理:利用defer延遲處理的recover進行恢復,具體例子如下:

package main

import (
    "fmt"
)

func main() {
    defer func() {
        fmt.Println("1")
    }()
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    panic("fault")
    fmt.Println("2")
}

運行結果:
  fault
  1

程序首先運行panic,出現故障,此時跳轉到包含recover()的defer函數執行,recover捕獲panic,此時panic就不繼續傳遞.但是recover之後,程序並不會返回到panic那個點繼續執行以後的動作,而是在recover這個點繼續執行以後的動作,即執行上面的defer函數,輸出1.

注意:利用recover處理panic指令,必須利用defer在panic之前聲明,否則當panic時,recover無法捕獲到panic,無法防止panic擴散.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章