【问题标题】:How to check err type returned from function(strconv.Atoi)如何检查函数返回的错误类型(strconv.Atoi)
【发布时间】:2020-08-03 17:39:15
【问题描述】:

我有以下测试strconv.Atoi()的基本代码:

package main

import (
        "fmt"
        "strconv"
)

func main() {

        var a int
        var b string
        var err Error

        b = "32"

        a,err = strconv.Atoi(b)

        fmt.Println(a)
        fmt.Println(err)

}

我想处理strconv.Atoi() 中是否存在错误,特别是如果错误是由于语法或范围引起的,strconv.Atoi() 可以提供的条件。为此,我已经尝试过:

package main

import (
        "os"
        "fmt"
        "strconv"
)

func main() {

        var a int
        var b string
        var err error

        b = "32"

        a,err = strconv.Atoi(b)

        if(err.Err == ErrSyntax) {
                fmt.Println("ERROR")
                os.Exit(1)
        }

        fmt.Println(a)
        fmt.Println(err)

}

我得到了这个结果:

% go build test.go
# command-line-arguments
./test.go:19:8: err.Err undefined (type error has no field or method Err)
./test.go:19:16: undefined: ErrSyntax

我想了解如何处理Atoi可以返回的两个错误(ErrSyntaxErrRange)。

【问题讨论】:

    标签: go strconv


    【解决方案1】:

    你可以使用errors包(Working with Errors in Go 1.13):

    if errors.Is(err, strconv.ErrSyntax) {
        fmt.Println("syntax error")
        os.Exit(1)
    }
    

    【讨论】:

    • 这似乎比使用err.(*strconv.NumError).Err == strconv.ErrSyntax的答案更容易阅读
    • 而且更安全 ?? err.(*strconv.NumError).Err 可能会在您使用返回 error 接口的 api 时生成 panic。示例:panic: interface conversion: error is *errors.errorString, not *strconv.NumError ➡️ 尝试将一个 type 转换为另一个。你总是需要检查演员表 (err, ok := err.(*strconv.NumError); ok {...})。
    【解决方案2】:

    包的包文档显示没有包限定符的名称,要从其他地方使用它们,您必须限定它们。所以试试strconv.ErrSyntax

    但这不会有太大帮助,因为通用错误接口没有.Err 成员。要检查这一点,您必须知道返回的错误实际上是 strconv.*NumError。根据文档,它应该是。

    https://play.golang.org/p/UKL6kKDqSx4

        if err != nil && err.(*strconv.NumError).Err == strconv.ErrSyntax {
            fmt.Println("syntax error")
            os.Exit(1)
        }
    

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 2019-12-12
      • 2021-12-23
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多