Go语言引入了两个内置函数 panic() 和 recover() 以报告和处理运行时错误和程序中的错误场景:

  1. func panic(interface{})
  2. func recover() interface{}

1 panic()

类似于Python的raise, C++的throw

(1) 如何调用

当在一个函数执行过程中调用 panic() 函数时,正常的函数执行流程将立即终止,
但函数中之前使用 defer 关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致逐层向上执行 panic 流程,直至所属的goroutine中所有正在执行的函数被终止。
错误信息将被报告,包括在调用 panic() 函数时传入的参数,这个过程称为错误处理流程。
从 panic() 的参数类型 interface{} 我们可以得知,该函数接收任意类型的数据,比如整型、字符串、对象等。
调用方法很简单,下面为几个例子:

  1. panic(404)
  2. panic("network broken")
  3. panic(errors.New("file not exists"))

(2) 与os.Exit()的区别

  • os.Exit()退出时不会调用defer
  • os.Exit()退出时不输出当前调用栈信息

    2 recover()

    recover() 函数用于捕获panic, 吞掉
    可以自行处理, 但一般不会在此处处理, 有panic肯定直接去改foo()代码实现了呀
    所以recover()一般只是用来记录异常到日志 ```go func foo() { panic(“file not exists”) }

func main() { defer func() { if err := recover(); err != nil { // 记到日志后, 由于不知道怎么处理, 还是抛出让程序异常退出 log.Panicf(“Runtime error caught: %v”, r) } }() fmt.Println(“start”) foo() fmt.Println(“done”) } ``` 一般不使用recover, 因为panic就是