Ошибки
В Go нет исключений для обычных сбоев. Когда функция может не справиться — не найти файл, не распарсить число, не достучаться до сети — она возвращает ошибку как обычное значение: последним в списке результатов идёт error. Вызывающий получает это значение и сам решает, что делать: обработать на месте, вернуть выше или, реже, проигнорировать осознанно. Никакого try/catch, никакого автоматического «всплытия» — поток выполнения остаётся явным и линейным.
За этой простотой стоит несколько решений, которые и проверяют на junior-секции: error — это интерфейс, обычное значение, которое можно вернуть, сохранить в переменную и сравнить с nil; создаётся ошибка через errors.New или fmt.Errorf; а panic существует отдельно — только для действительно исключительных ситуаций, а не для ожидаемых неудач. Эта тема разбирает базу обработки ошибок по слоям — от идиомы возврата до канонической проверки if err != nil. Глубину обёртывания (%w, errors.Is/errors.As, sentinel-ошибки) разбирает отдельная тема Обработка ошибок.
Карта темы
- Возврат ошибок — идиома
(результат, error): ошибка идёт последним возвращаемым значением;nilозначает успех; вызывающий решает, что делать дальше. errors.Newиfmt.Errorf— создать ошибку с текстом черезerrors.New("текст")или собрать форматированную черезfmt.Errorf("...: %v", x); глагол%wоборачивает (глубокое обёртывание — в go-error-handling).- Ошибка — это значение —
errorэто обычный интерфейс, который возвращают, хранят и проверяют; в отличие отpanic, это не исключение, а часть нормального результата функции. - Идиома
if err != nil— проверять ошибку сразу после вызова и либо обрабатывать, либо возвращать раньше; не глушить её через_; многословный, но явный контроль.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Игнорировать возвращённую ошибку через _ | Сбой проглатывается молча — value, _ := strconv.Atoi(s) спрячет невалидный ввод |
Ставить error не последним возвращаемым значением | Нарушает идиому; читатель и линтер ждут error именно в конце |
| Ждать, что неудача «выбросится» сама, как исключение | В Go ошибка не всплывает — пока её явно не вернуть выше, её просто нет |
Использовать panic для ожидаемой неудачи (нет файла, плохой ввод) | panic — только для исключительного; обычный сбой должен быть error |
Возвращать «пустой» результат без проверки err | При err != nil результат не определён — читать его до проверки опасно |
Путать errors.New и fmt.Errorf | errors.New — фиксированный текст; fmt.Errorf — форматирование и обёртывание через %w |
Значение для собеседований
Обработка ошибок — это junior-фильтр на «понимает модель Go» против «переносит привычки из языков с исключениями». Сама идиома тривиальна, но именно отличие от try/catch спрашивают почти всегда.
Что обычно проверяют:
- Как функция в Go сообщает о неудаче и почему
errorидёт последним возвращаемым значением. - Что
error— это обычное значение (интерфейс), а не выбрасываемое исключение, и кто решает, что с ним делать. - Чем
errors.Newотличается отfmt.Errorfи что делает глагол%w. - Почему
nil-ошибка означает успех и почему результат нельзя читать до проверкиerr. - Чем
panic/recoverотличается от обычной обработки ошибок и когдаpanicуместен (исключительные случаи, а не ожидаемые сбои).