У меня конечно элементарный вопрос, но вот никак не могу понять принцип работы конструкции 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();
}
?>
Если в блоке 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 заменены на генерацию исключений. Механизм ошибок и исключений не связаны друг с другом.
Чтобы отловить ошибку, необходимо её выбросить через 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Мне нужно во время перебора массива добавить новое значение в следующий элементДелаю так: