0

Зачем нужен код исключений PHP? Примеры использования?

11

Здравствуйте, коллеги!

У меня есть вопрос, который может показаться простым и даже банальным, но надеюсь на вашу помощь и поддержку :)

Когда я выбрасываю исключение в PHP, я могу добавить код к сообщению об ошибке. Я перехватываю исключение и обрабатываю его в зависимости от его типа (например, InvalidArgumentException или OutOfBoundException). Логи сообщают мне о сообщении, я могу его выводить или делать что-то подходящее.
Также я могу добавить предыдущее исключение, чтобы отслеживать путь к источнику ошибки.

НО есть одна вещь, которую я никогда не использовал и не задумывался о ней: насколько полезен код?

Например:

throw new Exception("Ошибка базы данных", $code, $previousException);

Что мне делать с $code? Какова его основная цель и как его лучше использовать? Буду благодарен за советы!

5 ответ(ов)

0

Сообщение предназначено для отображения пользователю, в то время как код используется вашим программным обеспечением. Например, в вашем случае "ошибка базы данных" можно создать набор кодов, таких как:

  1. Не удается подключиться
  2. Ошибка при выполнении запроса
  3. Пустой результат
  4. Ошибка при закрытии соединения

Затем используйте соответствующий код. Таким образом, когда другие части вашего кода столкнутся с этим исключением, они будут знать, что произошло, и смогут, возможно, обработать это более разумно.

0

Вы правы, в некоторых фреймворках, таких как CakePHP, действительно используется свойство $code для установки кода статуса HTTP. Это достаточно распространенная практика, когда исключения, наследуемые от базового класса HttpException, автоматически обрабатываются и генерируют соответствующие HTTP-коды ошибок.

Если вы реализовали аналогичный подход, где все исключения, наследуемые от HttpException, возвращают HTTP-ошибки, это может быть полезным способом централизованного управления обработкой ошибок в вашем приложении. Убедитесь, что ваш обработчик ошибок корректно ловит эти исключения и отправляет клиенту соответствующий статус-код вместе с сообщением об ошибке. Таким образом, ваш API будет более понятным для пользователей, так как они смогут видеть соответствующие коды ошибок в зависимости от ситуаций, которые произошли.

0

В языках программирования, ориентированных на объекты, тип исключения указывает на тип ошибки. Однако, если, например, у вас есть два разных источника, которые могут генерировать одно и то же исключение, код ошибки может быть использован для предоставления более детальной информации о проблеме.

Код ошибки является широко используемой функциональностью в неориентированных на объекты языках для указания на тип ошибки.

0

На данный момент дано много хороших ответов, но удивляет, что никто не затронул суть того, что такое код ошибки на самом деле.

Код ошибки нужен по той же причине, по которой в таблице базы данных требуется столбец с уникальным идентификатором. Это уникальный идентификатор для конкретной ошибки, которая произошла.

Имя типа исключения — это не то же самое. Например:

  • Может существовать несколько вариантов или причин исключения одного типа. Код ошибки может предоставить больше информации при обращении к справочной информации, чем просто тип ошибки.
  • Когда вы вручную вызываете ошибку в коде, то есть множество преимуществ в том, чтобы иметь возможность передать с ней пользовательский код ошибки. Вы можете захотеть идентифицировать конкретную ошибку или место в коде, где это произошло, не создавая новый тип для каждого исключения в вашем коде.
  • Когда вам нужно проверить объект ошибки, чтобы понять, что произошло, проще выполнить if ($error->code === 201), чем проверять тип или сравнивать строки сообщений об ошибках. Если вы не хотите использовать 201 в своем коде, потому что это не передает суть ошибки, легко назначить его константе.
  • Если вы хотите записать информацию об ошибке в базу данных, наличие уникального идентификатора значительно упрощает работу с базой данных. А когда вы извлекаете это из базы данных для работы с ним в коде (уже не в объекте исключения), снова проще идентифицировать ошибку по коду ошибки и работать с ней. Если вы храните что-то вроде имени класса в базе данных, что произойдет, если кто-то запишет его в базе в camelCase вместо PascalCase, или не вспомнит точное имя, или допустит опечатку и т.д. Даже если вы используете перечисления, что если вам нужно взаимодействовать с другой базой данных, которая могла использовать другой формат?
  • Если вы предоставляете пользователю код ошибки в приложении, и он переходит на страницу со списком ошибок, ему значительно проще найти конкретную ошибку по коду, чем просматривать текстовые описания ошибок. Также легче найти эту информацию в поисковой системе.

В общем, наличие глобального кода ошибки упрощает хранение, ссылку, передачу, сравнение, изменение форматов без потери информации, совместное использование кода и данных с другими, создание пользовательских ошибок и т.д. Большинство вещей, которые относятся к хранению данных в базе данных с уникальным идентификатором, также относятся к хранению ошибки с кодом ошибки.

0

Я использую код для получения сжатого сообщения об ошибке, которое пользователь може отправить в службу поддержки. Например, предположим, что пользователь пытается пройти аутентификацию, но терпит неудачу. В моем коде выбрасывается AuthenticateException с сообщением: Не удалось пройти аутентификацию и уникальным кодом, указывающим на реальную причину сбоя. Пользователь видит только сообщение об аутентификации и код, не зная истинной причины неудачи.

Далее пользователю советуется, при необходимости, обратиться в службу поддержки с указанным кодом. На основе кода исключения наши коллеги из службы поддержки могут легко определить, в чем заключалась реальная причина сбоя аутентификации (недействительный пароль, несуществующее имя пользователя, аккаунт был приостановлен и т. д.) и помочь пользователю соответственно.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь