Исключения «из коробки»

Свершилось! Теперь G-Drive поддерживает исключения «из коробки». Можно смело генерировать исключения в вашем коде (контроллерах или моделях) и получать приемлемый вывод в виде страниц ошибок и т.п. Теперь нет нужды для каждой библиотеки описывать используемый механизм исключений. Есть базовый механизм, который используется по умолчанию.

Аскетизм сохранился. Мы получили обертку try/catch для контроллера и класс HTTPException, уточняющий назначение параметров $message и $code. Но этого вполне достаточно, чтобы вывести обработку ошибок на качественно новый уровень. Мне сразу захотелось переписать все мои статьи под новую кодовую базу. Удивительно даже, что после такого нововведения авторы движка решили сохранить прежний мажорный номер версии. Но все же этот релиз был выделен. Кроме номера версии он получил и кодовое имя – Pi.

При обновлении моих статей буду стараться, чтобы они оставались предельно доступными. Прежде всего добавлю функцию выполнения запроса к БД, которая может генерировать исключение при появлении ошибки выполнения запроса. Какой тип исключения следует использовать в функции? Сразу генерировать HTTP-исключение 503 нежелательно, т.к. нужно абстрагироваться от вывода. Специальный тип исключения БД? Хорошая практика, но уже не аскетично :) Остается самое простое решение – использовать базовый класс Exception. Авторы движка постарались, чтобы для всех исключений кроме HTTPException по умолчанию выводилась 503-яя станица. Это как раз то, что мне нужно. Итак сама функция:

function query($query)
{
    if ($result = $GLOBALS['link']->query($query)) return $result;
    throw new Exception;
}

Внедрение объекта-соединения с БД сделано при помощи ссылки на глобальную переменную $link, поэтому в функцию не нужно передавать соответствующий параметр явно.

Чаще всего я буду вызывать данную функцию непосредственно в контроллере, чтобы не отрываться от использования языка SQL в основной программе. Вы же можете выполнять подобные вызовы в моделях.

Что касается обработки исключений, в основном я буду полагаться на обработку по умолчанию, т.к. она мне полностью подходит. Если раньше мне приходилось самому делать проверку на ошибку, вызывать функцию error и выполнять выход из контроллера, то теперь за меня это делает движок за пределами контроллера. Если по каким-то причинам вы не используете G-Drive, просто воссоздайте его поведение при обработке исключений – это всего лишь несколько строк кода:

class HttpException extends Exception {}

try { 
    // вызов контроллера
} catch (Exception $e) {
    error(
        $e instanceof HttpException ? $e->getCode() : 503,
        $e->getMessage()
    );
}

В данном коде самое большое отличие G-Drive от большинства других движков заключается в том, что функция error только устанавливает HTTP-статус ответа и состояние служебных переменных для страницы ошибки, но не формирует и тем более не выводит ее. Вы можете использовать свою реализацию функции error. Для этого не нужно менять код обработки исключений.

При желании после показанного кода также можно закрывать соединение с БД, используя функцию db_close новой версии движка. Но если к этому моменту уже состоялся весь вывод, закрытие соединения с БД можно возложить на «сборщик мусора».

Для генерации HTTP-исключений можно использовать функцию abort, которая появилась в новой версии движка.

Комментарии: 1

  1. Михаил

    При использовании исключительно PHP 7 и выше можно указать в блоке catch вместо базового класса Exception базовый интерфейс Throwable. Это позволит обрабатывать также исключения базового класса Error.

Отправить комментарий

Ваш адрес E-mail не будет опубликован.