Ответ
Упаковка ошибок (error wrapping) в Go — это добавление дополнительного контекста к ошибке при её передаче вверх по стеку вызовов. Позволяет сохранить исходную ошибку, оборачивая её в новую с дополнительной информацией.
До Go 1.13 использовали fmt.Errorf с %v:
if err != nil {
return fmt.Errorf("failed to process: %v", err)
}
С Go 1.13+ появился спец.формат %w:
if err != nil {
return fmt.Errorf("failed to process: %w", err)
}
Для проверки упакованных ошибок:
if errors.Is(err, os.ErrNotExist) {
// обработка
}
var pathError *os.PathError
if errors.As(err, &pathError) {
// доступ к полям PathError
}
Ключевые преимущества:
- Сохраняется цепочка ошибок
- Можно проверять исходные ошибки через
errors.Is/As - Улучшает диагностику проблем