Чат Telegram
Группа ВКонтакте
Новый комментарий


Ilon 04.09.2018 в 14:05

что же дальше? будут Composer? и хочется делать и решать реальные задачки? вроде как писать блог? это возможно?

ivashkevich 05.09.2018 в 23:42

Да, всё это будет в скором времени.

SBTesla 14.11.2018 в 12:24

Домашку сначала сделай)))

virtual2018 03.01.2019 в 16:51

Классы PHP не могут напрямую реализовать интерфейс Throwable, . (Ссылка на документацию)

ivashkevich 04.01.2019 в 08:52

Верно!

andreskrip 11.02.2020 в 16:17

Спасибо за урок! Единственное, что заметил - это то, что если одновременно и ошибка при подключении к БД и несуществующий роут, то выдаст ошибку 404, а не 500. Так и должно быть?

ivashkevich 12.02.2020 в 13:06

Зависит от того, какая ошибка возникнет первой.

New 15.03.2020 в 18:18

Вроде на первый взгляд - несложная тема, но что-то в ступор вогнало((. Как-то не очень сразу понятно в конкретной ситуации, где оборачивать в try, где ловить исключение. Понятно одно - ловить исключение нет смысла раньше. чем оно может появиться, а пытаться обработать ситуацию на возможное исключение нужно заблаговременно до возможной ситуации. Сложность - в пространственном ориентировании - размещении try/catch сквозь слои классов и методов. Ну и осталась не менее интересная тема за кадром - обработка ошибок. Почему в курсе рассмотрены именно исключения, а ошибки обделены вниманием?

Есть и более конкретные вопросы:

  1. как раз о местоположении try в коде.
<?php

try {
    spl_autoload_register(function (string $className) {
        require_once __DIR__ . '/../src/' . $className . '.php';
    });

    $route = $_GET['route'] ?? '';
    $routes = require __DIR__ . '/../src/routes.php';

    $isRouteFound = false;
    foreach ($routes as $pattern => $controllerAndAction) {
        preg_match($pattern, $route, $matches);
        if (!empty($matches)) {
            $isRouteFound = true;
            break;
        }
    }

    if (!$isRouteFound) {
        throw new \MyProject\Exceptions\NotFoundException();
    }

    unset($matches[0]);

    $controllerName = $controllerAndAction[0];
    $actionName = $controllerAndAction[1];

    $controller = new $controllerName();
    $controller->$actionName(...$matches);
} catch (\MyProject\Exceptions\DbException $e) {
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('500.php', ['error' => $e->getMessage()], 500);
} catch (\MyProject\Exceptions\NotFoundException $e) {
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('404.php', ['error' => $e->getMessage()], 404);
}

Почему тут try в самом начале кода, если автозагрузка классов, инициализация переменной route никак не влияет на возможное появление исключения - как то не найдена страница, или ошибка обращения к БД? Понятно, что такой большой захват кода в try не влияет в данном случае на логику, просто это вызывает дополнительные вопросы..

  1. Понятное дело, что ошибки/исключения возникают в некой очередности, а не все одновременно. Затрудняюсь привести конкретный пример, где это было прямо очень важно/необходимо, но может же быть необходимым вывести несколько ошибок/исключений? Насколько правильно корректно - показывать только первую ошибку/исключение или если только ошибка не делает невозможным дальнейшее выполнение кода, - все, что возникли? Да, немного в кучу и ошибки и исключения, но думаю, что суть вопроса понятна).

ivashkevich 16.03.2020 в 20:08
  1. Обрабатываемые исключения действительно могут броситься не во всем коде, обернутом в try. Можно блок try уменьшить. А можно добавить еще один catch с обработкой Throwable, на случай совсем уж непредвиденных ситуаций.
  2. Если требуется вывести несколько ошибок, можно во-первых сформировать готовую строку с ошибками и в конце обернуть это в одно исключение. Во-вторых можно использовать интересный паттерн MultiException. Ознакомьтесь на досуге.
Логические задачи с собеседований