Go 1.20更新:
从Go版本1.20开始,您可以使用新的errors.Join
function(忽略nil
错误)加入错误:
err = errors.Join(err, nil, err2, err3)
错误演示场。加入
此外,fmt.Errorf
函数现在支持使用多个%w
格式占位符包裹多个错误:
err := fmt.Errorf("%w; %w; %w", err, err2, err3)
fmt.Errorf的游乐场示例
Go 1.13更新:
从Go版本1.13开始,该语言的错误包现在直接支持错误包装。
您可以使用fmt.Errorf
中的%w
动词来包装错误:
err := errors.New("Original error")
err = fmt.Errorf("%w; Second error", err)
使用
Unwrap来移除最后添加的错误,并返回剩余的内容:
previousErrors := errors.Unwrap(err)
errors.Unwrap的示例
另外两个函数,
errors.Is和
errors.As提供了检查和检索特定类型错误的方法。
errors.As和errors.Is的示例
Dave Cheney的优秀的
errors
包(
https://github.com/pkg/errors)包括一个
Wrap
函数,用于此目的:
package main
import "fmt"
import "github.com/pkg/errors"
func main() {
err := errors.New("error")
err = errors.Wrap(err, "open failed")
err = errors.Wrap(err, "read config failed")
fmt.Println(err)
}
这也允许额外的功能,例如解包错误的原因:
package main
import "fmt"
import "github.com/pkg/errors"
func main() {
err := errors.New("original error")
err = errors.Wrap(err, "now this")
fmt.Println(errors.Cause(err))
}
同时,当指定fmt.Printf("%+v\n", err)
时,还可以选择输出堆栈跟踪。
您可以在他的博客此处和此处找到有关该软件包的更多信息。