登录
首页 >  Golang >  Go问答

errors.Wrapf()、errors.Errorf() 和 fmt.Errorf() 之间有什么区别?

来源:Golang技术栈

时间:2023-03-26 11:11:05 147浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《errors.Wrapf()、errors.Errorf() 和 fmt.Errorf() 之间有什么区别?》,本文主要会讲到golang等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

Go 的标准包中的这三个函数有什么区别:

  • errors.Wrapf()

Wrapf 返回一个错误,在调用 Wrapf 时使用堆栈跟踪注释 err 和格式说明符。如果 err 为 nil,Wrapf 返回 nil。

  • errors.Errorf()%w,通过格式变量提供错误

Errorf 根据格式说明符进行格式化,并将字符串作为满足错误的值返回。Errorf 还记录调用它时的堆栈跟踪。

  • fmt.Errorf()%w,通过格式变量提供错误

Errorf 根据格式说明符进行格式化,并将字符串作为满足错误的值返回。

如果格式说明符包含带有错误操作数的 %w 动词,则返回的错误将实现返回操作数的 Unwrap 方法。包含多个 %w 动词或为其提供不实现错误接口的操作数是无效的。%w 动词是 %v 的同义词。

什么时候应该使用一个来代替其他?

正确答案

首先,更正:

github.com/pkg/errors不是标准库的一部分 标准errors包的 API 要小得多。

也就是说,github.com/pkg/errors它非常受欢迎,并由一些著名的 Gophers 维护。然而,它在很大程度上(尽管不是完全*)被Go 1.13 的扩展错误支持所淘汰。

了解这三个功能之间的区别需要一些历史课。

在 Go 1.13 之前,没有官方认可的“包装”错误的方法。 用and方法github.com/pkg/errors填补了这个空白。这允许使用额外的上下文(包括堆栈跟踪)包装错误,同时以原始形式保留原始错误。Wrap``Wrapf

Go 1.13 在开发时,github.com/pkg/errors用于影响新的 API,但最终版本略有不同。他们决定用一个新动词来扩展该方法,而不是Wrap和方法,这将为您执行错误包装。Wrapf``fmt.Errorf``%w

这意味着以下代码位大致*等效:

    import "github.com/pkg/errors"

    /* snip */

    return errors.Wrapf(err, "bad things")



    // +build go1.13

    import "fmt"

    /* snip */
    return fmt.Errorf("bad things: %w", err)

当 Go 1.13 出来时,%w动词被添加到fmt.Errorf,github.com/pkg/errors跟风并添加了相同的支持,所以现在Wrapf实际上已经过时了。

所以这给我们带来了今天的建议:

  1. 如果您希望在错误中包含堆栈跟踪,请使用github.com/pkg/errors.Errorf来包装错误。
  2. 如果您不关心堆栈跟踪,请使用fmt.Errorf标准库。
  3. 永远不要再使用errors.Wrapf了。这是为了向后兼容。

*标准库的error包仍然不包括堆栈跟踪,因此github.com/pkg/errors仍然很受欢迎。

到这里,我们也就讲完了《errors.Wrapf()、errors.Errorf() 和 fmt.Errorf() 之间有什么区别?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>