310просмотров
8 августа 2024 г.
statsScore: 341
4 из 8 Обработка исключений и ошибок Нужно более тщательно обрабатывать ошибки, ловить exceptions, чтобы скрипт не падал в случае какой-то ошибки, которой можно пренебречь. Например, не удалось обработать одно из сообщений из брокера очередей, это не значит, что мы должны остановить обработку очереди. Решение простое, обернуть процессинг в try-catch <?php ... while (shouldStop() === false) { ... try { $messageProcessor->process($message); } catch (Throwable) { // тут стоит добавить логирование } ...
} ... Так мы обработаем исключения, но остаются ещё ошибки. Для решения этой задачи я предлагаю конвертировать ошибку в исключение и обрабатывать её в стандартном флоу. Это можно сделать с помощью set_error_handler . <?php ... set_error_handler( callback: static function (int $code, string $message, string $filename, int $line) { throw new ErrorException( message: $message, code: $code, filename: $filename, line: $line, ); }, error_levels: E_ERROR | E_PARSE | E_CORE_ERROR | E_USER_ERROR
); while (shouldStop() === false) { ... try { $messageProcessor->process($message); catch (Throwable) { // сюда будут попадать и исключения и ошибки } ...
} .. Нужно продумать, что именно указать в error_levels и что лучше подходить для вашего случая. Я обычно ставлю E_ALL , но для прода игнорирую E_WARNING, E_DEPRECATED. Такие предупреждения, как правило, не доходят до прода, но если так случилось, что они выстрелили в проде, то пытаемся обработать ситуацию как есть. Возможно для вашего кейс E_WARNING будет критичным, и его стоит обрабатывать как ошибку.