← ко всем постам
2026-08-14 · #basics

Ошибки как значения: почему в Go нет исключений

Программисты, приходящие из Python или Java, первым делом спотыкаются об это: в Go нет try/catch. Ошибка — это обычное значение, которое функция возвращает наравне с результатом.

f, err := os.Open("data.txt")
if err != nil {
    return fmt.Errorf("открыть файл: %w", err)
}
defer f.Close()

Оборачивание через %w

Глагол %w в fmt.Errorf сохраняет исходную ошибку в цепочке. Потом её можно достать через errors.Is и errors.As — это заменяет привычную иерархию исключений.

Да, if err != nil встречается на каждом шагу. Но взамен вы всегда видите, где именно может что-то пойти не так — путь ошибки виден прямо в коде, а не спрятан в невидимом стеке исключений.