golang panic and recover

panic 是一个内置函数,当一个函数 F 调用 panic,F 的执行就会停止,F 中 deferred 函数调用会被执行,然后 F 返回控制到它的调用者。这个过程会沿着调用栈执行下去,直到当前 goroutine 中的所有函数返回,然后程序 crash。出现 panic 是因为:



调用了 panic 函数

出现了运行时错误(例如,数组越界访问)

recover 是一个内置函数,用于恢复一个 panicking goroutine 的控制。需要注意的是,recover 只能使用在 deferred 函数中。如果当前的 goroutine panicking,recover 调用将会捕获 panic 传递的值并且恢复正常的执行。看一个例子:



package main



import "fmt"



func main() {

  f()

  fmt.Println("Returned normally from f.")

}



func f() {

  defer func() {

    if r := recover(); r != nil {

      fmt.Println("Recovered in f", r)

    }

  }()

  fmt.Println("Calling g.")

  g(0)

  fmt.Println("Returned normally from g.")

}



func g(i int) {

  if i > 3 {

    fmt.Println("Panicking!")

    panic(fmt.Sprintf("%v", i))

  }

  defer fmt.Println("Defer in g", i)

  fmt.Println("Printing in g", i)

  g(i + 1)

}

此程序输出:



Calling g.

Printing in g 0

Printing in g 1

Printing in g 2

Printing in g 3

Panicking!

Defer in g 3

Defer in g 2

Defer in g 1

Defer in g 0

Recovered in f 4

Returned normally from f.

 

你可能感兴趣的:(golang)