@wohejo

Как правильно обрабатывать ошибки в go?

Прочитал несколько статей, но не совсем до конца понял что и как, сделал вот такой пример:
var ErrNumbersAreEqual = errors.New("a is equal to b")

func checkNumbers(a, b int) (string, error) {
	if a == b {
		return "", ErrNumbersAreEqual
	}
	return "Numbers are not equal", nil
}

func main() {
	str, err := checkNumbers(1, 1)
	if err != nil {
		if errors.Is(err, ErrNumbersAreEqual) {
			fmt.Println(ErrNumbersAreEqual)
		}
	}
	fmt.Println(str)
}

хороший(нормальный) ли это способ обрабатывать свои кастомные ошибки или это не совсем корректный вариант и есть другие? Также не совсем понял когда что использовать errors.Is или errors.As, расскажите пожалуйста чуть подробнее)
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
Пример, конечно, очень странный. Не ясно, где применять такую функцию.
Но матчинг ошибки через Is и вынесение ее в var сделаны правильно.

Is используем, когда надо проверить, наследована ли ошибка от указанной кастомной ошибки.

As используем, когда надо получить оригинальную структуру этой кастомной ошибки и посмотреть у нее нужные поля или дернуть нужные методы.
As использовался бы, например, если бы мы хотели внутрь ошибки всунуть доп. информацию и иметь к ней доступ. Например, http-код для этой ошибки.

https://go.dev/play/p/AGbxpqQKteC
type CustomError struct {
	Text     string
	HttpCode int
}

func (c *CustomError) Error() string {
	return c.Text
}

func main() {
	err := doSomeStuff()
	if err != nil {
		customErr := &CustomError{}
		if errors.As(err, &customErr) {
			fmt.Println(customErr.Text, " http code:", customErr.HttpCode)
		}
	}
}

func doSomeStuff() error {
	return &CustomError{
		Text:     "please provide a password",
		HttpCode: 401,
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы