PHP try-catch не работает
try
{
$matrix = Query::take("SELECT moo"); //this makes 0 sense
while($row = mysqli_fetch_array($matrix, MYSQL_BOTH)) //and thus this line should be an error
{
}
return 'something';
}
catch(Exception $e)
{
return 'nothing';
}
Однако вместо того, чтобы просто ловить часть и возвращать nothing
, она отображает предупреждение Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given
в строке, начинающейся с while
. Я никогда не приходил к использованию исключений в php, но использовал их много в С#, и, похоже, на PHP они работают по-другому или, как всегда, я пропускаю что-то очевидное.
Ответы
Ответ 1
Вы не можете обрабатывать предупреждения/ошибки с помощью блоков try-catch, потому что они не являются исключениями. Если вы хотите обрабатывать предупреждения/ошибки, вам необходимо зарегистрировать свой собственный обработчик ошибок с помощью set_error_handler
.
Но лучше исправить эту проблему, потому что вы можете ее предотвратить.
Ответ 2
В PHP предупреждение не является исключением. Как правило, лучшей практикой было бы использовать защитное кодирование, чтобы убедиться, что результатом является то, что вы ожидаете от него.
Ответ 3
Welp, к сожалению, это проблема PHP. Операторы Try/catch будут перехватывать Исключения, но то, что вы получаете, является ошибкой PHP старой школы.
Вам придется поймать ошибку, например:
http://php.net/manual/en/function.set-error-handler.php
Либо это, либо проверить, не является ли $matrix объектом mysqli_result до выполнения mysqli_fetch_array.
Ответ 4
PHP генерирует предупреждение, а не исключение. Предупреждения не могут быть пойманы. Они больше похожи на предупреждения компилятора на С#.
Ответ 5
Исключение - это только подкласс Throwable. Чтобы поймать ошибку, вы можете попытаться выполнить одно из следующих действий:
try {
catch (\Exception $e) {
//do something when exception is thrown
}
catch (\Error $e) {
//do something when error is thrown
}
ИЛИ более инклюзивное решение
try {
catch (\Exception $e) {
//do something when exception is thrown
}
catch (\Throwable $e) {
//do something when Throwable is thrown
}
Кстати: у Java подобное поведение.