PHP PHP  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Исключения и ошибки PHP

Задания показывают разницу между перехватом ожидаемой ошибки и сокрытием причины аварии. Нужно читать Throwable, finally и цепочки исключений, выбирать уровень обработки и сохранять данные для диагностики.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. Для каждого сбоя решите: кто способен его исправить, что нужно записать и что увидит клиент. Время — 70 минут.
Вопрос 1 из 25
Что включает интерфейс Throwable?
PHP
try {
    riskyOperation();
} catch (Throwable $error) {
    echo $error::class;
}
Вопрос 2 из 25
Какой catch сработает?
PHP
try { strlen([]); }
catch (TypeError $e) { echo 'type'; }
catch (Exception $e) { echo 'exception'; }
Вопрос 3 из 25
Почему catch (Throwable) внутри каждой маленькой функции опасен?
PHP
function loadOrder(int $id): Order
{
    try {
        return repository()->find($id);
    } catch (Throwable $error) {
        return new Order();
    }
}
Вопрос 4 из 25
Как сохранить исходное исключение при оборачивании?
PHP
try { $repo->save($order); }
catch (PDOException $e) {
 throw new OrderSaveException('Не удалось сохранить заказ', 0, $e);
}
Вопрос 5 из 25
Что произойдёт при throw нового stdClass?
Вопрос 6 из 25
Для чего обычно используют set_error_handler с ErrorException?
PHP
set_error_handler(static function (int $severity, string $message, string $file, int $line): never {
    throw new ErrorException($message, 0, $severity, $file, $line);
});
Вопрос 7 из 25
Почему обработчик проверяет error_reporting() & $severity?
PHP
set_error_handler(function($severity,$message,$file,$line){
 if (!(error_reporting() & $severity)) return false;
 throw new ErrorException($message,0,$severity,$file,$line);
});
Вопрос 8 из 25
Может ли set_error_handler перехватить синтаксическую ошибку текущего файла до начала выполнения?
PHP
set_error_handler(static function (int $severity, string $message): never {
    throw new ErrorException($message, 0, $severity);
});

require 'module.php';
Вопрос 9 из 25
Что важно сделать после временного обработчика?
Вопрос 10 из 25
Что возвращает обработчик ошибок, если хочет передать ошибку стандартному обработчику PHP?
Вопрос 11 из 25
Выполнится ли finally после return из try?
PHP
function f(){ try { return 1; } finally { echo 'cleanup'; } }
echo f();
Вопрос 12 из 25
Что опасно в return внутри finally?
PHP
function calculate(): int
{
    try {
        throw new RuntimeException('Сбой');
    } finally {
        return 10;
    }
}
Вопрос 13 из 25
Какое сообщение будет выведено после перехвата исключения ближайшим подходящим блоком catch?
PHP
try { echo 'A'; throw new RuntimeException(); }
catch (RuntimeException $e) { echo 'B'; }
finally { echo 'F'; }
Вопрос 14 из 25
Что делать, если закрытие ресурса в finally само может выбросить ошибку?
PHP
$primary = null;
try {
    performOperation();
} catch (Throwable $error) {
    $primary = $error;
    throw $error;
} finally {
    try {
        $resource->close();
    } catch (Throwable $closeError) {
        $logger->error('Не удалось закрыть ресурс', ['exception' => $closeError, 'primary' => $primary]);
    }
}
Вопрос 15 из 25
Какой ресурс особенно уместно освобождать в finally?
Вопрос 16 из 25
Что должен показывать клиенту рабочий сайт при неожиданном Throwable?
PHP
try {
    $response = $application->handle($request);
} catch (Throwable $error) {
    $eventId = bin2hex(random_bytes(8));
    $logger->critical('Unexpected error', ['event_id' => $eventId, 'exception' => $error]);
    $response = new Response(500, "Ошибка сервера. Код события: $eventId");
}
Вопрос 17 из 25
Где логично преобразовывать DomainNotFound в HTTP 404?
Вопрос 18 из 25
Почему set_exception_handler не заменяет локальные catch?
Вопрос 19 из 25
Как избежать двойной отправки ответа при исключении после частичного вывода?
Вопрос 20 из 25
Что полезно включить в запись неожиданной ошибки?
Вопрос 21 из 25
Как PHPUnit проверяет ожидаемое исключение?
PHP
$this->expectException(DomainException::class);
$this->expectExceptionMessage('Недостаточно средств');
$account->withdraw(5000);
Вопрос 22 из 25
Почему проверять только текст исключения хрупко?
Вопрос 23 из 25
Что даёт getPrevious()?
Вопрос 24 из 25
Как локализовать редкий сбой, не записывая персональные данные?
Вопрос 25 из 25
Какой минимальный тест подтверждает сохранение причины?
PHP
try { service(); }
catch (OrderSaveException $e) {
 assert($e->getPrevious() instanceof PDOException);
}

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу