gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:38:21 64 4
gpt4 key购买 nike

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

  • errors.Wrapf()

  • Wrapf returns an error annotating err with a stack trace at the point Wrapf is called, and the format specifier. If err is nil, Wrapf returns nil.


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

  • Errorf formats according to a format specifier and returns the string as a value that satisfies error. Errorf also records the stack trace at the point it was called.


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

  • Errorf formats according to a format specifier and returns the string as a value that satisfies error.


    If the format specifier includes a %w verb with an error operand, the returned error will implement an Unwrap method returning the operand. It is invalid to include more than one %w verb or to supply it with an operand that does not implement the error interface. The %w verb is otherwise a synonym for %v.


    什么时候应该使用一个而不是其他的?

    最佳答案

    首先,更正:

    github.com/pkg/errors 不是标准库的一部分!标准 errors 包有一个更小的 API。

    也就是说,github.com/pkg/errors非常流行,并由一些著名的 Gophers 维护。然而,它在很大程度上(虽然不是完全*)被 Go 1.13's extended error support 淘汰了。 .

    理解这三个函数之间的区别需要一些历史课。

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

    在 Go 1.13 开发时,github.com/pkg/errors用于影响新 API,但最终版本略有不同。而不是 WrapWrapf方法,他们决定扩展 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实际上已经过时了。

    因此,这将我们带到了当今的建议:
  • 如果您想在错误中进行堆栈跟踪,请使用 github.com/pkg/errors.Errorf包装错误。
  • 如果您不关心堆栈跟踪,请使用 fmt.Errorf来自标准库。
  • 从不使用 errors.Wrapf没有了。这是为了向后兼容。


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

    关于go - errors.Wrapf()、errors.Errorf() 和 fmt.Errorf() 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61933650/

    64 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com