概要:在goroutine中发生panic,会导致整个系统退出是一个很严重的问题。在这篇文章中,我将在go func(){}上编写一个带有panic恢复功能的简单包装库(包)。之后,我们可以在任何地方使用这个包来安全地执行Goroutine。
代码:让我们将包命名为async:
package async
import (
"fmt"
)
/*
* `Execute`提供异步安全地执行函数的方法,在可能发生panic时进行恢复。
*/
func Execute(fn func()) {
go func() {
defer recoverPanic()
fn()
}()
}
/*
*当goroutine发送panic,将错误信息打印到控制台
*/
func recoverPanic() {
if r := recover(); r != nil {
err, ok := r.(error)
if !ok {
err = fmt.Errorf("%v", r)
}
fmt.Println(err)
}
}
现在,您可以在项目中的任何地方轻松导入这个包,并安全地调用goroutine。例如,让我们看看下面的代码:
async.Execute(func() {
someUint64, err = strconv.ParseUint("7770009", 10, 16)
if err != nil {
panic(err)
}
})
这是一个非常实用的编程技巧,能防止go协程中一些可能存在的panic未捕获导致程序奔溃。