轻聆月下
轻聆月下
发布于 2024-03-24 / 8 阅读
0
0

Golang使用recover函数处理painc

一、 recover() 函数简介

其原型为:

func recover() interface{}

如同Java或者C#等语言中的 try/cache 一样。recover() 函数用于处理 golang 中的 panic 。

二、 用法

如果不用 recover() 将导致程序异常退出,如下:

package main

func doSomething() {
	panic("Error: xxxx")
}

func main() {
	doSomething()
}

输出:

panic: Error: xxxx

goroutine 1 [running]:
main.doSomething(...)
        /temp/main.go:4
main.main()
        /temp/main.go:8 +0x27
exit status 2

如果使用了 recover() 处理 panic,则程序会正常结束:

package main

import "fmt"

func handlePanic() {
	if err := recover(); err != nil {
		fmt.Println("Handle Panic: ", err)
	}
}

func doSomething() {
	defer handlePanic()
	panic("Error: xxxx")
}

func main() {
	doSomething()
}

输出:

Handle Panic:  Error: xxxx

三、 要点

  1. recover() 函数必须在 defer 标记的方法中调用。如果直接调用或者不在 defer 标记的方法中运行,则 recover() 函数不会阻止panic的传递,而进一步导致程序异常结束。
  2. recover() 只能处理同一个协程(goroutine)中抛出的 painc (子协程也不行)。如果需要捕获所有panic,则需要在每一个协程中使用 recover()
  3. 如果想要观察堆栈信息的话,可以使用 debug.PrintStack() 输出堆栈信息。

评论