Обработка ошибок в разных языках
языки используют разные модели: исключения, коды возврата, Result/Either, паника.
Почему это важно: Плохая обработка ошибок — главная причина падений продакшена. Модель языка задаёт стиль работы с ошибками во всём коде.
Главная идея
Исключения, коды возврата и Result — три основных подхода, и у каждого есть сильные стороны и ловушки.
Как это выглядит на практике
- Запрос к базе падает из-за deadlock.
- В Java/Ruby/Python исключение всплывает вверх по стеку до ближайшего rescue/catch.
- В Go функция возвращает err, и проверка if err != nil обязательна.
- В 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).
Термины урока
Связь с работой backend-разработчика
В production-сервисах правильная обработка ошибок определяет, сколько инцидентов вы отловите заранее, а сколько — по алертам в три часа ночи.
Мини-разбор реальной ситуации
Микросервис на Go игнорировал err из json.Unmarshal, и при невалидном ответе возвращал пустой объект. Месяц это выглядело как 'пропажа данных', пока не нашли при аудите.
Что запомнить
- Явная обработка лучше магии.
- Обработка 'на всякий случай' маскирует настоящие баги.
- Выбирайте уровень обработки, где есть контекст.
Итог
Правильная обработка ошибок — не второстепенная задача, а основа надёжности backend-сервиса.
Комментарии к уроку
Войдите, чтобы оставить комментарий.
Пока нет комментариев — будьте первым.