【发布时间】:2021-09-13 16:28:21
【问题描述】:
哪个更好?
1
err := MakeFood()
if err != nil{
return err
}
2
err := MakeFood()
if err != nil{
logs.Errorf("failed to make food, error=%v",err)
return err
}
3
err := MakeFood()
if err != nil{
return fmt.Errorf("failed to make food, error=%w",err)
}
4
var ErrMakeFood = errors.New("failed to make food")
err := MakeFood()
if err != nil{
return ErrMakeFood // we discard err
}
在我的实践中,return fmt.Errorf("xxx, error=%w",err) 是我最喜欢的,它会在错误发生并返回时创建一个级联错误字符串。
但似乎,在 go builtin src 代码中,return err 是正常和整洁的。
有时我们被建议使用静态错误声明(我给出的示例 4)。这是名为 goerr113 的 golang-lint 的 lint 规则。
【问题讨论】:
-
定义自己的错误包。
-
做最适合您团队的事情。如果您注意到与仅返回错误而不包装错误相关的信息丢失,并对其进行扩展证明是有问题的,那么无论如何
return fmt.Errorf("xxx, error=%w", err)是更优越的选择。有时,您需要打破常规才能满足您的需求。 -
唯一的答案是“视情况而定”。你必须做你认为最适合这种情况的方法。选项 2 是唯一在我看来客观错误的选项;通常你应该处理或返回一个错误,而不是处理和返回它。
标签: go error-handling