Trigger_error против исключения броска

Аналогичный вопрос был задан здесь, но поскольку ответы не отвечали на мой вопрос, я спрашиваю:

Я почти никогда не использовал trigger_error, всегда выбрасывал исключения, так как в моем сознании ошибки являются устаревшими. Но я передумал, думаю, они могут сосуществовать. Бывают случаи, когда ошибки при запуске имеют больше смысла.

Я обновляю эту библиотеку, этот вопрос относится к методу send, но достаточно общий. Это мои рассуждения:

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

  • Если адрес электронной почты недействителен, это должно быть увлекательным. Это, скорее всего, ошибка пользователя.

Я локомотив? Это ненужно и раздражает, или это имеет смысл?

Ответы

Ответ 1

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

Ответ 2

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

Так как все мои ошибки PHP (примечание: исключений, но предупреждений, уведомлений, смертей и т.д.) регистрируются в процессе производства, я думаю, trigger_error - удобный способ получить материал в указанном журнале.

Вот пример:

Я использую HTTP-клиент для доступа к API, который мы интегрируем. Разумеется, библиотека, которую я использую, является объектно-ориентированным PHP и поэтому сильно использует исключения. Я здесь делаю разные вещи, и я надеюсь, что этот пример имеет смысл:

  • Клиентская библиотека HTTP генерирует исключение, когда фактический запрос не удался - например. из-за проблемы с подключением, такой как тайм-аут и т.д. Конечно, я поймаю эту ошибку, но я не подниму ее пользователю. Моя обертка возвращает false, и это равно: "Временная проблема". в интерфейсе.
  • В моем блоке catch() я использую trigger_error() для регистрации отладочной информации о фактической ошибке соединения. Поскольку я получил error_log = syslog в моей php.ini, вся эта информация отправляется в syslog и в конечном итоге в мой мастер журнала.

Ответ 3

Оба они используют свои возможности. Как правило, я запускаю trigger_error() для разработчиков, так как в большинстве производственных средах сообщение об ошибках отключается; то, поскольку большинство ошибок приложения, скорее всего, будут из-за неправильного ввода или нежелательных результатов на основе ввода/действий пользователя, я исключаю исключения для лучшего контроля над приложением (обработка этих исключений способом, позволяющим восстанавливать приложение, и ( если необходимо) информирует пользователя о том, что произошло логически.

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