文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
错误处理
概述
Hyperledger Fabric 代码应该使用 vendor 的包 github.com/pkg/errors 来代替 Go 提供的标准错误类型。该软件包允许生成和显示带有错误信息的堆栈跟踪。
使用说明
应该使用 github.com/pkg/errors 来代替对 fmt.Errorf() 或 errors.New() 的所有调用。使用此程序包将生成一个调用堆栈,该调用堆栈会被附加到错误信息上。
使用该程序包很简单,只需对您的代码做轻微调整。
首先,您需要引入 github.com/pkg/errors
然后,更新您的代码生成的所有错误,以使用其中一个错误创建函数(errors.New(), errors.Errorf(), errors.WithMessage(), errors.Wrap(), errors.Wrapf()).
注解
可用的错误创建方法的完整文档请查看 https://godoc.org/github.com/pkg/errors 。也可以参考下边通用指南的章节来了解在 Fabric 代码中使用该包的更多指南。
最后,将所有记录器或 fmt.Printf() 调用的格式指令从 %s
更改为 %+v
,以打印调用堆栈和错误信息。
Hyperledger Fabric 中错误处理的通用准则
- 若要处理用户请求,应记录并返回错误。
- 若错误来自外部来源(如 Go 依赖库或 vendor 的包),则用 errors.Wrap() 包装该错误,为其生成一个调用堆栈。
- 若错误来自另一个 Fabric 函数,当有需要时,在不影响调用堆栈的情况下使用 errors.WithMessage() 在错误信息中添加更多上下文。
- Panic 不应被传播给其他软件包。
示例程序
以下案列程序清楚地展示了如何使用软件包:
package main import ( "fmt" "github.com/pkg/errors" ) func wrapWithStack() error { err := createError() // do this when error comes from external source (go lib or vendor) return errors.Wrap(err, "wrapping an error with stack") } func wrapWithoutStack() error { err := createError() // do this when error comes from internal Fabric since it already has stack trace return errors.WithMessage(err, "wrapping an error without stack") } func createError() error { return errors.New("original error") } func main() { err := createError() fmt.Printf("print error without stack: %s\n\n", err) fmt.Printf("print error with stack: %+v\n\n", err) err = wrapWithoutStack() fmt.Printf("%+v\n\n", err) err = wrapWithStack() fmt.Printf("%+v\n\n", err) }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论