Введите подтверждение ошибок в go - PullRequest
0 голосов
/ 06 апреля 2020

Я выполняю небольшую функцию, чтобы проверить error для некоторых типов и решить (в зависимости от типа ошибки), стоят ли некоторые повторы.

Я создал свой собственный temporary интерфейс для введите assert all net/http ошибки, которые реализуют этот интерфейс (который, однако, не экспортируется, и поэтому я также объявляю его своим кодом)

type temporary interface {
    Temporary() bool
}

Итак, я хочу повторить попытку при ошибке net / http реализации интерфейса temporary, а также в случае, если ошибка относится к одному из следующих типов: io.EOF, io.ErrUnexpectedEOF из ErrTimeoutExceeded

, где

var ErrTimeoutExceeded = errors.New("timeout exceeded")

, однако следующее оператор switch


func isWorthRetrying(err error) bool {
    switch e := err.(type) {
    case temporary:
        return true
    case io.EOF:
        return true
    case io.ErrUnexpectedEOF:
        return true
    case ErrTimeoutExceeded:
        return true
    default:
        return false
    }
}

выдает ошибки во всех операторах (кроме одного типа, подтверждающего temporary)

с ошибкой, например,

io.EOF ( ошибка типа) не является типом

Что это значит?

1 Ответ

3 голосов
/ 06 апреля 2020

В вашем операторе switch вы проверяете против err.(type), который имеет тип . Значения io.EOF, io.ErrUnexpectedEOF и ErrTimeoutExceeded не являются типами, это объекты. Вы не можете проверить, является ли тип объектом (разные вещи); однако вы можете проверить, имеет ли объект тип .

Вы можете использовать следующий код для проверки обоих сценариев ios:

func isWorthRetrying(err error) bool {
        switch err.(type) {
        case temporary:
                return true
        default:
                switch err {
                case io.EOF:
                        return true
                case io.ErrUnexpectedEOF:
                        return true
                case ErrTimeoutExceeded:
                        return true
                default:
                        return false
                }
        }
}

РЕДАКТИРОВАТЬ : благодаря комментарию Адриана, мы также можем написать эту функцию, используя новый errors.Is, если вы используете Go 1.13 +:

func isWorthRetrying(err error) bool {
        switch err.(type) {
        case temporary:
                return true
        default:
                return errors.Is(err, io.EOF) ||
                        errors.Is(err, io.ErrUnexpectedEOF) ||
                        errors.Is(err, ErrTimeoutExceeded)
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...