Ответ
В Go есть несколько подходов к обработке ошибок:
- Возврат ошибки как второго значения (стандартный способ):
result, err := someFunction()
if err != nil {
// обработка ошибки
}
- Собственные типы ошибок через
errors.New()илиfmt.Errorf():
err := errors.New("something went wrong")
err = fmt.Errorf("context: %v", err)
- Проверка типа ошибки с
errors.Isиerrors.As:
if errors.Is(err, os.ErrNotExist) {
// обработка конкретной ошибки
}
var pathError *os.PathError
if errors.As(err, &pathError) {
// доступ к полям кастомной ошибки
}
- Паника и восстановление (только для критических ошибок):
defer func() {
if r := recover(); r != nil {
// обработка паники
}
}()
panic("critical error")
- Обертки ошибок (с добавлением контекста):
if err != nil {
return fmt.Errorf("operation failed: %w", err)
}