Ошибки в PHP — это как неожиданные гости: никогда не знаешь, когда придут, и что после себя оставят. Но если научиться с ними правильно обращаться, ваш код станет надёжнее, а вы — спокойнее. В этой статье разберём, чем отличаются ошибки от исключений, как их ловить и обрабатывать, и почему без этого не обходится ни один серьёзный проект.

Digital-студия WNDER

Чем ошибка отличается от исключения

В PHP есть два механизма работы с проблемами: ошибки (errors) и исключения (exceptions). Ошибки — это низкоуровневые сбои: например, вызов несуществующей функции, деление на ноль или синтаксическая ошибка. Исключения — это объекты, которые вы или сам PHP выбрасываете, когда что-то пошло не так. Их можно поймать и обработать.

До PHP 7 ошибки было сложно перехватывать. Но с выходом PHP 7 появился интерфейс Throwable, который объединяет и Error, и Exception. Теперь можно ловить почти всё.

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

Конструкция try-catch: ловим исключения

Основной инструмент для работы с исключениями — блок try...catch. В try вы пишете код, который может выбросить исключение, а в catch — что делать, если оно произошло.

Но чаще мы имеем дело с исключениями, которые выбрасываем сами. Например, при валидации данных:

getMessage();
}

Можно ловить разные типы исключений в разных блоках catch. Это позволяет гибко реагировать на разные ситуации.

Порядок важен: более специфичные исключения должны идти раньше, чем общие.

Пользовательские исключения: создаём свои

Иногда стандартных исключений не хватает. Тогда можно создать своё, унаследовавшись от Exception или Error. Это помогает лучше понять, что именно пошло не так.

getMessage();
}

Создание своих исключений — хорошая практика, потому что они делают код самодокументируемым и упрощают отладку.

Обработка ошибок: set_error_handler и error_reporting

Ошибки в PHP можно перехватывать с помощью set_error_handler(). Это позволяет превратить обычные ошибки в исключения или записать их в лог.

getMessage();
}

Важно настроить error_reporting() так, чтобы в разработке вы видели все ошибки, а на продакшене — только критические, иначе пользователи увидят лишнее.

Логирование ошибок: чтобы не гадать

Логи — ваш лучший друг. Вместо того чтобы выводить ошибки на экран, лучше писать их в файл или специальную систему (например, Sentry). PHP умеет логировать ошибки автоматически, если включить log_errors.

Но можно и вручную логировать исключения:

getMessage(), 3, '/var/log/my_app_errors.log');
    // и дальше можно что-то сделать, например, показать пользователю заглушку
}

Используйте библиотеки вроде Monolog для удобного логирования. Они позволяют писать логи в разные места и с разными уровнями важности.

Правила и лайфхаки

Правило: Никогда не оставляйте пустой блок catch. Если поймали исключение, что-то с ним сделайте: залогируйте, покажите сообщение, выбросьте дальше. Иначе ошибка просто исчезнет, и вы будете долго искать причину.

Вот ещё несколько советов, которые сэкономят вам часы отладки:

  • Используйте finally для кода, который должен выполниться в любом случае (например, закрытие файла или соединения).
  • Не злоупотребляйте исключениями для управления потоком. Они для исключительных ситуаций.
  • В продакшене всегда отключайте вывод ошибок на экран, но включайте логирование.
  • Создавайте иерархию исключений для вашего приложения, чтобы различать типы ошибок.

И ещё одна таблица, которая поможет быстро вспомнить основные функции и настройки:

Функция/настройка Назначение
try...catch Ловля исключений
throw Выброс исключения
set_error_handler() Перехват ошибок
error_reporting() Уровень отображаемых ошибок
error_log() Запись в лог
finally Блок, выполняемый всегда

Что в итоге

Обработка ошибок и исключений — это не просто «надо», это обязательная часть качественного кода. Она делает приложение устойчивым к сбоям, упрощает поддержку и спасает нервы разработчику. Запомните главное: ловите исключения, логируйте ошибки, не оставляйте пустых catch и настраивайте окружение правильно. Тогда ваш PHP-код станет надёжным, как швейцарские часы.

Студия WNDER