3 回答
TA贡献1852条经验 获得超7个赞
Go 1.13(2019 年第三季度)声明错误并将其与“ ==
”(如err == myPkg.ErrTokenExpired
)进行比较不再是最佳实践
发行说明提到:
Go 1.13 包含对错误包装的支持,这在错误值提案中首次提出并在相关问题上进行了讨论。
一个错误可以通过提供一个返回的方法
e
来包装另一个错误。 两者和都可用于程序,允许为它提供额外的上下文或重新解释它,同时仍然允许程序基于.w
Unwrap
w
e
w
e
w
w
为了支持包装,
fmt.Errorf
现在有一个%w
用于创建包装错误的动词,并且包中的三个新函数( 和errors
)errors.Unwrap
简化了展开和检查包装错误。errors.Is
errors.As
所以错误值FAQ解释说:
你需要做好准备,你得到的错误可能会被包装。
如果您当前使用 比较错误
==
,请errors.Is
改用。
例子:if err == io.ErrUnexpectedEOF变成
if errors.Is(err, io.ErrUnexpectedEOF)
err != nil
如果不需要更改,请检查表格。比较
io.EOF
不需要改变,因为io.EOF
不应该被包装。如果您使用类型断言或类型 switch检查错误类型,请
errors.As
改用。例子:if e, ok := err.(*os.PathError); ok变成
var e *os.PathError if errors.As(err, &e)也可以使用此模式来检查错误是否实现了接口。(当指向接口的指针合适时,这是极少数情况之一。)
将类型开关重写为
if-elses
.
TA贡献2037条经验 获得超6个赞
此答案适用于 Go 1.12 及更早版本。
在库中定义错误值
package fruits
var NoMorePumpkins = errors.New("No more pumpkins")
不要errors.New在代码中的任何地方创建错误,而是在发生错误时返回预定义的值,然后您可以执行以下操作:
package shop
if err == fruits.NoMorePumpkins {
...
}
请参阅io包错误以供参考。
这可以通过添加方法来隐藏检查实现并使客户端代码更不受fruits包中更改的影响来改进。
package fruits
func IsNoMorePumpkins(err error) bool {
return err == NoMorePumpkins
}
请参阅os包错误以供参考。
- 3 回答
- 0 关注
- 192 浏览
添加回答
举报