如何检查函数返回的错误类型(strconv.Atoi)

How to check err type returned from function(strconv.Atoi)

我有以下测试 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可以return(ErrSyntax,ErrRange).

包的包文档显示没有包限定符的名称,要从其他地方使用它们,您必须限定它们。所以试试 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)
    }

您可以使用 errors package (Working with Errors in Go 1.13):

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