Что выведет код 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 ошибок.