Предпосылки: Предположим, что у меня есть следующий явно неправильный PHP:
try{ $vtest = ''; print(array_pop($vtest)); }catch(Exception $exx){}
Чтобы он работал с array_pop, $ vtest, очевидно, должен быть массивом, а не строкой. Тем не менее, когда я запускаю этот код, появляется предупреждение. Я не хочу этого, я просто хочу, чтобы код терпел неудачу.
Вопрос: Есть ли что-то особенное в попытках PHP по сравнению с другими языками, которые заставляют это работать?
Отказ от ответственности: только для справки, правда, есть другие способы справиться с этой ситуацией в PHP, но это нежелательно. Цель здесь состоит в том, чтобы избежать:
Трюк «at-sign»:
$vtest = ''; print(@array_pop($vtest)); // <-- would like to avoid this
Тип Литье:
$vtest = ''; $vtest = (array)$vtest; print(array_pop($vtest));
Предупреждения и уведомления не являются технически исключениями в PHP. Чтобы поймать исключение, он должен быть явно брошен, и многие из встроенных библиотек функций не генерируют исключений (главным образом потому, что они были написаны перед исключениями, поддерживаемыми PHP).
Было бы неплохо, если бы некоторые исключения были построены поверх существующей системы уведомлений / предупреждений / ошибок, но, возможно, это слишком много.
Предоставляемый код всегда будет выдаваться кодом, который вы указали, но вы можете использовать set_error_handler для определения того, как обрабатывается предупреждение; т.е. вы можете вызвать его исключение. Кроме того, вы можете использовать restore_error_handler для возврата к обработке ошибок по умолчанию при выполнении.
function errorHandler($errno, $errstr, $errfile, $errline) { throw new Exception($errstr, $errno); } set_error_handler('errorHandler');
Вы можете поймать такие ошибки при преобразовании каждой ошибки в исключение. Я создал небольшую среду обработки ошибок . Просто проверьте это – он будет работать.
Единственный способ, о котором я могу думать, это сделать следующее:
try{ $vtest = ''; if(is_array($vtest)){ print(array_pop($vtest)); } else{ throw new NotArrayException() } }catch(NotArrayException $exx){}
Конечно, если вы просто хотите сделать это молча, вы можете просто сделать следующее, так как вам не нужно ничего исключать:
$vtest = ''; if(is_array($vtest)){ print(array_pop($vtest)); }