Зачем нужен код исключений PHP? Примеры использования?
Здравствуйте, коллеги!
У меня есть вопрос, который может показаться простым и даже банальным, но надеюсь на вашу помощь и поддержку :)
Когда я выбрасываю исключение в PHP, я могу добавить код к сообщению об ошибке. Я перехватываю исключение и обрабатываю его в зависимости от его типа (например, InvalidArgumentException
или OutOfBoundException
). Логи сообщают мне о сообщении, я могу его выводить или делать что-то подходящее.
Также я могу добавить предыдущее исключение, чтобы отслеживать путь к источнику ошибки.
НО есть одна вещь, которую я никогда не использовал и не задумывался о ней: насколько полезен код?
Например:
throw new Exception("Ошибка базы данных", $code, $previousException);
Что мне делать с $code
? Какова его основная цель и как его лучше использовать? Буду благодарен за советы!
5 ответ(ов)
Сообщение предназначено для отображения пользователю, в то время как код используется вашим программным обеспечением. Например, в вашем случае "ошибка базы данных" можно создать набор кодов, таких как:
- Не удается подключиться
- Ошибка при выполнении запроса
- Пустой результат
- Ошибка при закрытии соединения
Затем используйте соответствующий код. Таким образом, когда другие части вашего кода столкнутся с этим исключением, они будут знать, что произошло, и смогут, возможно, обработать это более разумно.
Вы правы, в некоторых фреймворках, таких как CakePHP, действительно используется свойство $code
для установки кода статуса HTTP. Это достаточно распространенная практика, когда исключения, наследуемые от базового класса HttpException
, автоматически обрабатываются и генерируют соответствующие HTTP-коды ошибок.
Если вы реализовали аналогичный подход, где все исключения, наследуемые от HttpException
, возвращают HTTP-ошибки, это может быть полезным способом централизованного управления обработкой ошибок в вашем приложении. Убедитесь, что ваш обработчик ошибок корректно ловит эти исключения и отправляет клиенту соответствующий статус-код вместе с сообщением об ошибке. Таким образом, ваш API будет более понятным для пользователей, так как они смогут видеть соответствующие коды ошибок в зависимости от ситуаций, которые произошли.
В языках программирования, ориентированных на объекты, тип исключения указывает на тип ошибки. Однако, если, например, у вас есть два разных источника, которые могут генерировать одно и то же исключение, код ошибки может быть использован для предоставления более детальной информации о проблеме.
Код ошибки является широко используемой функциональностью в неориентированных на объекты языках для указания на тип ошибки.
На данный момент дано много хороших ответов, но удивляет, что никто не затронул суть того, что такое код ошибки на самом деле.
Код ошибки нужен по той же причине, по которой в таблице базы данных требуется столбец с уникальным идентификатором. Это уникальный идентификатор для конкретной ошибки, которая произошла.
Имя типа исключения — это не то же самое. Например:
- Может существовать несколько вариантов или причин исключения одного типа. Код ошибки может предоставить больше информации при обращении к справочной информации, чем просто тип ошибки.
- Когда вы вручную вызываете ошибку в коде, то есть множество преимуществ в том, чтобы иметь возможность передать с ней пользовательский код ошибки. Вы можете захотеть идентифицировать конкретную ошибку или место в коде, где это произошло, не создавая новый тип для каждого исключения в вашем коде.
- Когда вам нужно проверить объект ошибки, чтобы понять, что произошло, проще выполнить
if ($error->code === 201)
, чем проверять тип или сравнивать строки сообщений об ошибках. Если вы не хотите использовать 201 в своем коде, потому что это не передает суть ошибки, легко назначить его константе. - Если вы хотите записать информацию об ошибке в базу данных, наличие уникального идентификатора значительно упрощает работу с базой данных. А когда вы извлекаете это из базы данных для работы с ним в коде (уже не в объекте исключения), снова проще идентифицировать ошибку по коду ошибки и работать с ней. Если вы храните что-то вроде имени класса в базе данных, что произойдет, если кто-то запишет его в базе в camelCase вместо PascalCase, или не вспомнит точное имя, или допустит опечатку и т.д. Даже если вы используете перечисления, что если вам нужно взаимодействовать с другой базой данных, которая могла использовать другой формат?
- Если вы предоставляете пользователю код ошибки в приложении, и он переходит на страницу со списком ошибок, ему значительно проще найти конкретную ошибку по коду, чем просматривать текстовые описания ошибок. Также легче найти эту информацию в поисковой системе.
В общем, наличие глобального кода ошибки упрощает хранение, ссылку, передачу, сравнение, изменение форматов без потери информации, совместное использование кода и данных с другими, создание пользовательских ошибок и т.д. Большинство вещей, которые относятся к хранению данных в базе данных с уникальным идентификатором, также относятся к хранению ошибки с кодом ошибки.
Я использую код для получения сжатого сообщения об ошибке, которое пользователь може отправить в службу поддержки. Например, предположим, что пользователь пытается пройти аутентификацию, но терпит неудачу. В моем коде выбрасывается AuthenticateException
с сообщением: Не удалось пройти аутентификацию
и уникальным кодом, указывающим на реальную причину сбоя. Пользователь видит только сообщение об аутентификации и код, не зная истинной причины неудачи.
Далее пользователю советуется, при необходимости, обратиться в службу поддержки с указанным кодом. На основе кода исключения наши коллеги из службы поддержки могут легко определить, в чем заключалась реальная причина сбоя аутентификации (недействительный пароль, несуществующее имя пользователя, аккаунт был приостановлен и т. д.) и помочь пользователю соответственно.
Как обойти отсутствие блока finally в PHP?
PHP: Как проверить тип выброшенного исключения?
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?
Как читать большой файл построчно?