Мне нужно отловить некоторые предупреждения, выдаваемые родными функциями php, а затем обработать их.
В частности:
array dns_get_record ( string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]] )
Выдает предупреждение при сбое DNS-запроса.
try
/ catch
не работает, потому что предупреждение не является исключением.
У меня сейчас есть 2 варианта:
set_error_handler
кажется излишним, потому что я должен использовать его для фильтрации каждого предупреждения на странице (это правда?);Отрегулируйте отображение / отображение ошибок, чтобы эти предупреждения не отображались на экране, затем проверьте возвращаемое значение; если это так
false
, никакие записи не найдены для имени хоста.
Какова лучшая практика здесь?
php
error-handling
try-catch
user121196
источник
источник
Ответы:
Установить и восстановить обработчик ошибок
Одна возможность состоит в том, чтобы установить свой собственный обработчик ошибок перед вызовом и восстановить предыдущий обработчик ошибок позже
restore_error_handler()
.Вы можете основываться на этой идее и написать повторно используемый обработчик ошибок, который регистрирует ошибки для вас.
Превращение ошибок в исключения
Вы можете использовать
set_error_handler()
иErrorException
класс, чтобы превратить все ошибки PHP в исключения.При использовании собственного обработчика ошибок важно помнить, что он обойдёт
error_reporting
настройку и передаст все ошибки (уведомления, предупреждения и т. Д.) Вашему обработчику ошибок. Вы можете установить второй аргумент,set_error_handler()
чтобы определить, какие типы ошибок вы хотите получать, или получить доступ к текущим настройкам, используя... = error_reporting()
обработчик ошибок.Подавление предупреждения
Другая возможность - отменить вызов с помощью оператора @ и проверить возвращаемое значение
dns_get_record()
впоследствии. Но я бы посоветовал против этого, так как ошибки / предупреждения инициируются для обработки, а не для подавления.источник
Решение, которое действительно работает, оказалось установкой простого обработчика ошибок с
E_WARNING
параметром, например так:источник
callable
можно использовать анонимныйtrow new \Exception($errstr, $errno);
внутриwarning_handler
функции. Спасибо.Будьте осторожны с
@
оператором - хотя он подавляет предупреждения, он также подавляет фатальные ошибки. Я потратил много времени на отладку проблемы в системе, где кто-то написал,@mysql_query( '...' )
и проблема заключалась в том, что поддержка mysql не была загружена в PHP, и она выдавала тихую фатальную ошибку. Это будет безопасно для тех вещей, которые являются частью ядра PHP, но, пожалуйста, используйте это с осторожностью.Никаких дальнейших результатов - удачи в отладке!
На этот раз мы видим, почему это не удалось.
источник
Я хотел попробовать / поймать предупреждение, но в то же время сохранить обычное предупреждение / журнал ошибок (например, в
/var/log/apache2/error.log
); для которого обработчик должен вернутьfalse
. Однако, поскольку оператор «throw new ...» в основном прерывает выполнение, необходимо выполнить трюк «wrap in function», который также обсуждался в:Есть ли статический способ бросить исключение в php
Или вкратце:
РЕДАКТИРОВАТЬ: после более тщательного изучения выясняется, что это не работает: «
return false && throwErrorException ...
», в основном, не будет генерировать исключение, а просто войти в журнал ошибок; удаление части "false &&
", как в "return throwErrorException ...
", заставит работать исключение, но затем не войдет в журнал error_log ... Однако я все равно оставлю это в курсе, так как я не видел такого поведения, документированного где-либо еще.источник
Возможно, вам следует попытаться полностью избавиться от предупреждения, но если это невозможно, вы можете добавить к вызову @ (то есть @dns_get_record (...)), а затем использовать любую информацию, которую сможете получить, чтобы выяснить, произошло ли предупреждение или нет.
источник
Обычно вы никогда не должны использовать @, если это не единственное решение. В этом конкретном случае сначала следует использовать функцию dns_check_record, чтобы узнать, существует ли запись.
источник
Объединение этих строк кода вокруг
file_get_contents()
вызова по внешнему URL помогло мне обработать предупреждения типа « не удалось открыть поток: истекло время ожидания соединения »:Это решение работает и в контексте объекта. Вы можете использовать его в функции:
источник
Если
dns_get_record()
произойдет сбой, он должен вернутьсяFALSE
, так что вы можете подавить предупреждение с помощью@
и затем проверить возвращаемое значение.источник
попробуйте проверить, возвращает ли оно какое-либо логическое значение, тогда вы можете просто указать его как условие. Я столкнулся с этим с oci_execute (...), который возвращал некоторое нарушение с моими уникальными ключами.
источник
FolderStructure
CustomException.php
просто включите вышеуказанный файл в ваш скрипт
index.php
источник
Я бы рекомендовал использовать @ только для подавления предупреждений, когда это прямая операция (например, $ prop = @ ($ high / ($ width - $ глубина)); чтобы пропустить деление на ноль предупреждений). Однако в большинстве случаев лучше справиться.
источник