Как проверить тип ошибки, возвращаемый функцией (strconv.Atoi) - PullRequest
0 голосов
/ 03 августа 2020

У меня есть следующий базовый c код, который проверяет 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 может вернуть ( ErrSyntax, ErrRange).

Ответы [ 2 ]

5 голосов
/ 03 августа 2020

Можно использовать пакет errors ( Работа с ошибками в Go 1.13 ):

if errors.Is(err, strconv.ErrSyntax) {
    fmt.Println("syntax error")
    os.Exit(1)
}
4 голосов
/ 03 августа 2020

В документации пакета для пакета указаны имена без квалификатора пакета, чтобы использовать их из других источников, вы должны их квалифицировать. Так что попробуйте strconv.ErrSyntax.

Но это не совсем поможет, потому что нет члена .Err в интерфейсе generi c error. Чтобы проверить это, вы должны знать, что возвращенная ошибка на самом деле является strconv.*NumError. Каким должно быть, согласно документации.

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

    if err != nil && err.(*strconv.NumError).Err == strconv.ErrSyntax {
        fmt.Println("syntax error")
        os.Exit(1)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...