Go语言中的 panic 和 recover

主要讲解Go语言中的 panic和recover

知识点:

  • panic 在Go语言中 代表 无法进行处理的 严重问题发生,引起系统恐慌,抛出错误程序退出,在Go中能用error 就不用 panic,使用panic时代表 "这个问题处理不了,程序决定退出"。
  • 当程序执行至panic时,中断本函数的执行,并且一直向上返回panic,并执行每一层的 defer ,返回到最后,程序退出。
  • panic 向上返回的 过程中,如果碰到 recover ,则终止退出。
  • recover 可以获取到 panic 中的值,并中断退出,recover只能在 defer 中使用

代码示例如下:

package main

import (
	"fmt"
	"errors"
)

// panic 、recover示例用法
func tryRecover() {
	//
	defer func() {
		// 获取 panic 的值
		r := recover()
		if r == nil {
			fmt.Println("没有发现 panic !")
			return
		}
		// 判断 panic 是不是错误
		if err, ok := r.(error); ok {
			// 如果是错误,打印错误,并终止程序终止
			fmt.Println("Error occurred:", err)
		} else {
			// 如果不是错误,那么类型未知,继续 panic
			panic(fmt.Sprintf("I don't know what to do: %v", r))
		}
	}()


	// 自定义普通错误 error
	panic(errors.New("this is an error"))

	// 构建代码逻辑运行错误
	//b := 0
	//a := 5 / b
	//fmt.Println(a)

	// 无法处理的 错误
	//panic(123)
}

func main() {
	tryRecover()
}

猜你喜欢

转载自my.oschina.net/ruoli/blog/1816159