一个函数如果要把 panic 转化为error类型值,并将其结果返回给调用方,可以考虑把 defer 语句封装到一个匿名函数之中,下面是实验的一个例子,所用函数是一个除法函数,当除数为0的时候会抛出 panic并捕获。
func divide(a, b int) (res int, err error) {
func() {
defer func() {
if rec := recover(); rec != nil {
err = fmt.Errorf("%s", rec)
}
}()
res = a / b
}()
return
}
func main() {
res, err := divide(1, 0)
fmt.Println(res, err) // 0 runtime error: integer divide by zero
res, err = divide(2, 1)
fmt.Println(res, err) // 2 <nil>
}
展开