🐯 猫头虎博主来啦!今天我们将深入Go 1.13的错误处理新特性。一起探索如何通过增强的标准库功能,更优雅地处理和检查错误。🔍 准备好一起探索Go的错误处理奥秘了吗?
这篇文章是关于Go 1.13中处理错误的深入解析。Go一直将错误视为值,这种处理方式在过去十年中服务我们良好。尽管标准库对错误的支持较为基础,但新版本为我们带来了一些重要的改进。
在Go中,错误被视为值。我们通常通过将错误与nil
进行比较来检查操作是否失败。有时,我们还会将错误与已知的哨兵值进行比较。
通常,函数会在向调用栈上传递错误时添加信息。一个简单的方法是构建一个包含前一个错误文本的新错误:
if err != nil {
return fmt.Errorf("decompress %v: %v", name, err)
}
Go 1.13引入了Unwrap
方法,允许一个错误包含另一个错误。例如,我们可以给QueryError
类型添加一个返回其包含错误的Unwrap
方法:
func (e *QueryError) Unwrap() error { return e.Err }
Go 1.13的errors
包中包括两个新函数:Is
和As
。errors.Is
函数比较一个错误与一个值,而errors.As
函数检查一个错误是否为特定类型。
在Go 1.13中,fmt.Errorf
函数支持一个新的%w
动词。当这个动词出现时,fmt.Errorf
返回的错误将有一个Unwrap
方法返回%w
的参数。
决定是否包装原始错误取决于新错误创建的上下文。包装一个错误是为了将其暴露给调用者。不包装错误则意味着不暴露实现细节。
errors.Is
函数检查链中的每个错误是否与目标值匹配。此外,链中的错误可以通过实现Is
方法来声明它与目标匹配。
返回错误的包应描述程序员可以依赖的那些错误属性。良好设计的包还会避免返回不应依赖的属性错误。
尽管我们讨论的改变只是三个函数和一个格式化动词,但我们希望它们将大大改善Go程序中的错误处理方式。我们期待包装提供额外上下文将成为常态,帮助程序做出更好的决策,帮助程序员更快地发现错误。