Блок catch не срабатывает (PHP, конструкция try catch)

78
08 февраля 2022, 16:10

У меня конечно элементарный вопрос, но вот никак не могу понять принцип работы конструкции try-catch на php.

В общем имеем максимально простой код, как внизу. Функция checkNum($number) проверяет является ли число больше или меньше 5.

Функция выполняется в блоке try.

Если в блоке try мы нарочно сделаем какую-то ошибку (например назовем функцию checkNNNums, которой не существует), то это по идее должно приводить к исключению и выполнению блока catch.

Действительно появляется ошибка, но код, который в блоке catch не срабатывает, т.е. например мы не видим заложенной в него надписи 'Сработал блок Catch - Сообщение: ', а просто получаем Fatal error: Uncaught Error: Call to undefined function checkNums()

Мне нужно отработать именно try-catch, понимаю, что есть варианты решения через альтернативные варианты, но нужно именно таким образом.

PHP 7.3

Код ниже:

<?php
function checkNum($number) {
    if ($number>5) {
      echo "число больше 5";
    } else {
      echo "число меньше 5";
    }
}
try {
  checkNum(7);
  echo 'Сработал блок try';
}

catch(Exception $e) {
  echo 'Сработал блок Catch - Сообщение: ' .$e->getMessage();
}
?>
Answer 1

Если в блоке try мы нарочно сделаем какую-то ошибку (например назовем функцию checkNNNums, которой не существует), то это по идее должно приводить к исключению

Совершенно верно для вашей версии PHP. (не уверен в своей памяти и быстро проверить не удалось, вероятно для всех PHP 7.0 и новее)

Ваше заблуждение и ошибка в том, что вы ожидаете генерацию исключения класса Exception. Возможно вы считаете что все исключения наследованы от Exception. И как раз вот это неверно. Исключение в этом случае генерируется класса Error и этот класс в своём дереве наследования не опирается на Exception. Дерево наследования исключений в PHP7.0 и новее выглядит так:

Throwable
  Error
    ArithmeticError
      DivisionByZeroError
    AssertionError
    CompileError
      ParseError
    TypeError
      ArgumentCountError
  Exception

И если вы замените свой catch на:

catch(\Throwable $e) {

То он уже будет ловить эту ошибку в вашей версии PHP.

Тем не менее обратите внимание, что не все ошибки PHP заменены на генерацию исключений. Механизм ошибок и исключений не связаны друг с другом.

Answer 2

Чтобы отловить ошибку, необходимо её выбросить через throw new Exception();

<?php
function checkNum($number) {
    if ($number>5) {
      echo "число больше 5" . PHP_EOL;
    } else {
      echo "число меньше 5" . PHP_EOL;
    }
}
$validFunctionName = 'checkNum';
$invalidFunctionName = 'checkNum1';
// Успешно выполнится
try {
    if (!function_exists($validFunctionName))
        throw new Exception('Метод не найден.');
    $validFunctionName(7);
    echo 'Сработал блок try' . PHP_EOL;
} catch(Exception $e) {
  echo 'Сработал блок Catch - Сообщение: ' .$e->getMessage();
}
// Выбросит exception
try {
    if (!function_exists($invalidFunctionName))
        throw new Exception('Метод не найден.');
    $invalidFunctionName(7);
    echo 'Сработал блок try' . PHP_EOL;
} catch(Exception $e) {
  echo 'Сработал блок Catch - Сообщение: ' .$e->getMessage();
}

Вывод:

число больше 5
Сработал блок try
Сработал блок Catch - Сообщение: Метод не найден.

Если вам необходимо выбросить исключение в методе, то вы можете использовать следующую конструкцию:

<?php
function checkNum($number) {
    if ($number>5) {
      echo "число больше 5" . PHP_EOL;
    } else {
        throw new Exception('Число меньше 5');
    }
}
try {
    if (!function_exists('checkNum'))
        throw new Exception('Метод не найден.');
    checkNum(7);
    echo 'Считаем checkNum при аргументе 7' . PHP_EOL;
    checkNum(3);
    echo 'Считаем checkNum при аргументе 3' . PHP_EOL;
} catch(Exception $e) {
  echo 'Сработал блок Catch - Сообщение: ' .$e->getMessage();
}

Вывод:

число больше 5
Считаем checkNum при аргументе 7
Сработал блок Catch - Сообщение: Число меньше 5
READ ALSO
PhpMyadmin ошибка

PhpMyadmin ошибка

У меня ошибка в phpMyadmin, пропали все базы данныхКогда только захожу пишет

129
Масив php, вывести данные

Масив php, вывести данные

Здраствуйте, пожалуйста помогайте чайнику :)

87
Добавление в массив во время перебора PHP

Добавление в массив во время перебора PHP

Мне нужно во время перебора массива добавить новое значение в следующий элементДелаю так:

79