1 回答

TA贡献1995条经验 获得超2个赞
由于 panic 和 “软” 错误都是程序异常,因此应保留非 nil 错误语义。可以将错误包装在自定义类型或简单的 error 变量中,并在函数调用后进行检查。
此外,为了实际修改返回的错误,您还应该:
在延迟函数文本中使用
recover()
使用命名的返回参数
从规范延迟声明:
例如,如果延迟函数是函数文本,并且周围的函数已命名了文本范围内的结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数
package main
import (
"errors"
"fmt"
"log"
)
var ErrPanicRecovered = errors.New("recovered from panic")
// named return parameters
func recoverableFoo() (i int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%w: %v", ErrPanicRecovered, r)
}
}()
// panic("problem!") // or any call that may panic; uncomment to test
return 1, nil
}
func main() {
x, err := foo()
if err != nil {
if errors.Is(err, ErrPanicRecovered) {
log.Fatal("panicked: ", err)
}
log.Printf("some other error: %s", err.Error())
return
}
fmt.Println("after foo x = " + fmt.Sprint(x))
}
特别是,使用fmt。带有格式设置谓词的 Errorf 允许您正确包装错误,并在以后检查错误。是:%w
如果格式说明符包含带有错误操作数的谓词,则返回的错误将实现返回操作数的 Unwrap 方法。%w
游乐场: https://play.golang.org/p/p-JI1B0cw3x
- 1 回答
- 0 关注
- 72 浏览
添加回答
举报