Средний

Обработка ошибок в разных языках

Урок 3 из 3 в курсе Язык программирования: фундамент

Содержание курса (3/3)

Обработка ошибок в разных языках

языки используют разные модели: исключения, коды возврата, Result/Either, паника.

Почему это важно: Плохая обработка ошибок — главная причина падений продакшена. Модель языка задаёт стиль работы с ошибками во всём коде.

Главная идея

Исключения, коды возврата и Result — три основных подхода, и у каждого есть сильные стороны и ловушки.

Как это выглядит на практике

  1. Запрос к базе падает из-за deadlock.
  2. В Java/Ruby/Python исключение всплывает вверх по стеку до ближайшего rescue/catch.
  3. В Go функция возвращает err, и проверка if err != nil обязательна.
  4. В Rust компилятор заставляет обработать Result явно.

Что происходит под капотом

  • Исключения: Java, Python, Ruby, C#. Удобны, но легко забыть обработать и 'проглотить' ошибку.
  • Errors as values: Go возвращает (result, err). Многословно, но явно.
  • Result/Either: Rust, Haskell, функциональные языки. Компилятор заставляет учесть все варианты.
  • Паника/фатальная ошибка: Go panic, Rust panic! — для невосстановимых состояний.

Типичные ошибки и заблуждения

  • Ошибка: try/catch вокруг всего 'для надёжности'. Такой код скрывает баги и усложняет отладку.
  • Ошибка: возвращать nil при ошибке. Это прячет проблему до момента падения в другом месте.
  • Ошибка: все ошибки надо логировать и продолжать. Некоторые ошибки требуют немедленной остановки.
  • Ошибка: исключения всегда медленные. В большинстве языков путь без исключений почти бесплатен.

Ключевые выводы

  • Обрабатывайте ошибки на том уровне, где есть контекст для решения.
  • Не 'проглатывайте' исключения без логирования.
  • Явная обработка (Go, Rust) безопаснее, но многословнее.
  • Разделяйте ожидаемые ошибки (валидация) и баги (null pointer).

Термины урока

Exception (исключение): объект, представляющий ошибочное состояние, всплывающий по стеку.
Error (ошибка): значение, возвращаемое функцией при неудачной работе.
Panic: фатальное состояние, остановка программы (Go, Rust).
Result: тип-обёртка, представляющий либо успех, либо ошибку (Rust, Haskell).

Связь с работой backend-разработчика

В production-сервисах правильная обработка ошибок определяет, сколько инцидентов вы отловите заранее, а сколько — по алертам в три часа ночи.

Мини-разбор реальной ситуации

Микросервис на Go игнорировал err из json.Unmarshal, и при невалидном ответе возвращал пустой объект. Месяц это выглядело как 'пропажа данных', пока не нашли при аудите.

Что запомнить

  • Явная обработка лучше магии.
  • Обработка 'на всякий случай' маскирует настоящие баги.
  • Выбирайте уровень обработки, где есть контекст.

Итог

Правильная обработка ошибок — не второстепенная задача, а основа надёжности backend-сервиса.

Комментарии к уроку

Войдите, чтобы оставить комментарий.

Пока нет комментариев — будьте первым.