Что выведет код Middle Исключения и ошибки спрашивают часто обновлено
finally и перехват ошибок
Вопрос
Что выведет скрипт (PHP 8.3)? По строке на каждый вывод.
<?php
function run(int $x): string {
try {
if ($x === 0) {
throw new InvalidArgumentException('zero');
}
return 'ok ' . intdiv(10, $x);
} catch (InvalidArgumentException $e) {
return 'caught ' . $e->getMessage();
} finally {
echo "finally $x\n";
}
}
echo run(2), "\n";
echo run(0), "\n";
try {
echo intdiv(1, 0);
} catch (Exception $e) {
echo "exception\n";
} catch (Error $e) {
echo get_class($e), "\n";
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: finally 2, ok 5, finally 0, caught zero, DivisionByZeroError. finally выполняется до того, как значение return вернётся вызывающему, поэтому finally 2 печатается раньше ok 5.
Что выведет
finally 2
ok 5
finally 0
caught zero
DivisionByZeroError
Разбор
finally выполняется до того, как значение return вернётся вызывающему, поэтому finally 2 печатается раньше ok 5. Во втором вызове исключение поймано, finally снова перед результатом. intdiv(1, 0) бросает DivisionByZeroError, это Error, а не Exception, поэтому срабатывает второй catch.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.