Проверка (значение или тип) на наличие ошибок, возвращаемых fmt.Errorf - PullRequest
0 голосов
/ 13 апреля 2020

Если фрагмент кода имеет свой собственный тип ошибки, как в

var ErrSomethingWentWrong = errors.New("Something went wrong"

Я верю в свой код, я могу сделать это

import github.com/therepo/theproject/thepackage/thatexportstheaboveerror

// code that might return the above error
if err == thatexportstheaboveerror.ErrSomethingWentWrong {
    // handle the particular case
}

Что происходит, когда возвращаемая ошибка происходит через fmt.Errorf как в этом случае?

return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", keys(tried))

Каким образом можно (или тип, или что-либо еще) проверять / утверждать значение go -идиоматически? Это единственный способ обойти это?

if err != nil {
    if strings.Contains(err.Error(), "unable to authenticate") {
       // handle the particular error
    }
}

1 Ответ

2 голосов
/ 13 апреля 2020

Начиная с Go версии 1.13, пакет errors включает в себя понятие "обертывания" ошибок. Процедура, возвращающая «завернутую» ошибку, вызывает fmt.Errorf, используя глагол %w в формате, чтобы превратить внутреннюю ошибку во внешнюю ошибку. Затем можно проверить внешнюю ошибку, чтобы определить, содержит ли она конкретную внутреннюю ошибку.

До этого xerrors обеспечивали одинаковую общую концепцию.

Оба из они требуют, чтобы тот, кто выдавал значение ошибки, использовал предоставленный интерфейс переноса. Подпрограмма, о которой вы спрашиваете - часть https://godoc.org/golang.org/x/crypto/ssh - не делает этого. Некоторый старый код, который не переносит ошибки, предоставляет определенные функции тестирования ошибок. Например, когда os.Open возвращает ошибку, os.IsNotExist сообщит вам, если это ошибка, потому что файл не существует.

К сожалению, этот конкретный пакет такого теста нет, поэтому вы в значительной степени застряли на том, что предложили (прямая проверка строки), если вы действительно хотите программно узнать, что эта ошибка произошла из этого конкретного источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...