当前位置: 首页 > 知识库问答 >
问题:

Go有标准的错误变量吗?

东方河
2023-03-14

刚开始用戈朗。我认为习惯做法是声明一个错误变量,并在错误结构中使用它来确定哪里出了问题,就像strconv.go中所做的那样。在这里,声明errrangeerrsyntax,并且在返回时,对它们的引用将存储在numerror结构中。我认为这是因为可以将numerror中存储的对错误的引用的地址与errrangeerrsyntax变量进行比较,以确定返回的是哪种类型的错误。

是否存在“标准”的此类声明错误类型?例如,在Java中,有Java.lang.IllegalArgumentException等内容。例如,errargumenterrunsupportedoperation是否可以在自己的代码中使用,而不是每次都创建表示相同内容的新错误变量?

共有1个答案

穆俊杰
2023-03-14

包作者有几种常见的惯用方法来返回错误。

>

  • 固定错误变量,通常命名为err…

    var (
            ErrSomethingBad = errors.New("some string")
            ErrKindFoo      = errors.New("foo happened")
    )
    

    错误类型,通常命名为…Error

    type SomeError struct {
         // extra information, whatever might be useful to callers
         // (or for making a nice message in `Error()`)
         ExtraInfo int
    }
    type OtherError string
    
    func (e SomeError) Error() string { /* … */ }
    func (e OtherError) Error() string {
            return fmt.Sprintf("failure doing something with %q", string(e))
    }
    
    func SomepackageFunction() error {
            return errors.New("not implemented")
    }
    
    func SomeFunc() error {
            return io.EOF
    }
    

    创建net.error这样的接口:

    type Error interface {
        error
        Timeout() bool   // Is the error a timeout?
        Temporary() bool // Is the error temporary?
    }
    

    对于Go1.13或更高版本,使用简单上下文返回现有错误(对于更复杂的上下文,使用带有unwrap()方法的自定义错误类型):

    func SomepackageFunction() error {
        err := somethingThatCanFail()
        if err != nil {
                return fmt.Errorf("some context: %w", err)
        }
    }
    

    请注意新的格式谓词%w(to go ;1.13),它包装了提供的错误,以便调用方可以使用errors.unwraperror.is来处理它。

    err := somepkg.Function()
    if err == somepkg.ErrSomethingBad {
            // …
    }
    // or for an error type, something like:
    if e, ok := err.(somepkg.SomeError); ok && e.ExtraInfo > 42 {
            // use the fields/methods of `e` if needed
    }
    

    对于Go1.13或更高版本,可以将上述内容写成:

    err := somepkg.Function()
    if errors.Is(err, somepkg.ErrSomethingBad) {
            // …
    }
    // or for an error type, something like:
    var someErr somepkg.SomeError
    if errors.As(err, &someErr) && someErr.ExtraInfo > 42 {
            // use the fields/methods of `someErr` if needed
    }
    

    不同的是,错误将根据需要展开。

    第五种方法(只是第二种方法的扩展)允许检查行为/类型的错误(或者使用Go ;1.13的errors.as):

    if e, ok := err.(net.Error); ok && e.Timeout() {
            // it's a timeout, sleep and retry
    }
    
      null

  •  类似资料:
    • 问题内容: 刚开始使用Golang。我认为声明错误变量并在错误结构中使用它来确定出了什么问题是很习惯的,就像strconv.go中所做的那样。在那里,并且声明,并在适当的时候,对那些引用存储在结构,当他们返回。我认为原因是因为可以将存储在其中的错误的引用地址与和变量进行比较,以确定返回的错误类型。 是否有“标准”此类已声明的错误类型?例如,在Java中,您有类似的东西。例如,是否存在?或者我可以在

    • 1.1.1. 驱动错误代码 1.1.1. 驱动错误代码 标准错误 E_DRIVER_ERROR 通用错误 E_INVALID_AUTHORIZATION 授权非法,并且不应该继续使用、刷新 E_DRIVER_SIGN_ERROR 签名错误(Token 超时时使用)提醒用户去 App 授权 E_DRIVER_DEVICE_NO_FOUND 设备不存在 E_DRIVER_TIMEOUT 设备控制超时

    • 问题内容: 我知道全局变量不好。 但是,如果我在框架的40个文件中使用节点的模块“ util”,那么最好仅将其声明为全局变量,例如: 在index.js文件中,而不是在40个文件中写入该行? 因为我经常在每个文件中使用相同的5-10个模块,这样可以节省大量时间,而不是一直复制粘贴。 在这种情况下干不好吗? 问题答案: 每个模块应该是独立的。在每个模块的第一个需求之后,require都不会花费任何东

    • Go是静态类型语言,变量是有明确类型的。编译器会检查函数调用中,变量类型的正确性。 使用var关键字来定义变量。 Go 的基本类型有: bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // uint8 的别名 rune // int32 的别名 代表一个Unicode码 floa

    • 问题内容: 我有一个奇怪的问题,如果可以解决,那就太好了。出于调试目的(以及其他一些目的),我在标准输出上编写了控制台Java应用程序的日志。在标准输出上写一些内容,在标准错误上打印一些错误,例如错误。问题是这两个没有完全同步,因此打印线的顺序并不总是正确的。我猜这是因为打印了很多东西,并且碰巧一个输出的缓冲区已满,所以其他输出在第一个输出刷新其缓冲区之前就已打印出来。 例如,我想这样写: 有时打

    • 问题内容: 我正在尝试从https://github.com/go-yaml/yaml导入go- yaml,但看到Google无法帮助的错误。 我运行了,但是却遇到了错误:尝试运行程序时。我也不会在导入中做任何异国情调的操作: 任何帮助,将不胜感激! 问题答案: Go有两个必须在os环境中定义的路径,即GoRoot和GoPath,GoRoot是Go的安装路径,其中只有“标准软件包”。GoPath是