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 подобное поведение.