Go语言panic, recover

panic

  • 停止当前函数执行

  • 一直向上返回,执行每一层的defer

  • 如果没有遇见recover,程序退出

recover

  • 仅在defer中调用

  • 获取panic的值

  • 如果无法处理,可以重新panic

package main

import (
	"fmt"
)

func tryRecover() {
	defer func() {
		r := recover()
		if r == nil {
			fmt.Println("Nothing to recover. " +
				"Please try uncomment errors " +
				"below.")
			return
		}
		if err, ok := r.(error); ok {
			fmt.Println("Error occurred:", err)
		} else {
			panic(fmt.Sprintf(
				"I don't know what to do: %v", r))
		}
	}()
	panic(errors.New("this is an error"))

func main() {
	tryRecover()
}

系统的panic也可以捕捉到。

但是panic()的参数是interface{},可以传入任何值,而recover()的返回值也是interface{},所以recover不知道如何处理的时候需要继续panic处理。

加入传入一个panic(123)

Last updated

Was this helpful?