Дисциплины - Разработка веб-приложений

Продвинутый уровень - Обработка исключений

Что такое исключения в Laravel

Исключения — это ошибки, возникающие во время выполнения программы и нарушающие нормальный поток управления.

В процессе разработки может возникнуть необходимость генерировать/выбросить исключение вручную, в коде приложения, т.е. указать, что что-то пошло не так или что какое-то условие не было выполнено. Например, нет такой страницы, или пользователь не авторизован, попытка доступа к несуществующему свойству объекта, деление на ноль или вызов функции с недопустимыми аргументами — это всё примеры исключений.

Исключения могут создавать сами механизмы PHP (например, ParseError или TypeError) или кодом приложения (например, InvalidArgumentException или ModelNotFoundException). Исключение также могут быть определены пользователем путём расширения базового класса Exception или любого из его подклассов.

Как Laravel обрабатывает исключения

В новом проекте Laravel, обработка ошибок и исключений уже настроена. В классе App\Exceptions\Handler все исключения, создаваемые приложением, регистрируются, а затем отображаются для пользователя.

По умолчанию Laravel преобразует все исключения в HTTP ответы с соответствующими кодами состояния и сообщениями об ошибках. Например, исключение 404 Not Found приведёт к HTTP-ответу с кодом состояния 404 и сообщением Not Found. Исключение 500 Internal Server Error приведёт к HTTP-ответу с кодом состояния 500 и сообщением Whoops, something went wrong.

Laravel также предоставляет удобный способ отображения пользовательских страниц ошибок для разных кодов состояния HTTP. Например, чтобы настроить страницу ошибки 404, необходимо создать файл resources/views/errors/404.blade.php.

Как выбрасывать исключения в Laravel

Чтобы выбросить исключение в Laravel, можно использовать ключевое слово throw, за которым следует экземпляр класса исключения. Например:

public function show($id)
{
    $post = Post::find($id);

    if ($post == null) {
        // Выбросить исключение, если статья не существует
        throw new ModelNotFoundException('Post not found');
    }

    if (Auth::user()->cannot('view', $post)) {
        // Выбросить исключение, если пользователь не авторизован для просмотра статьи
        throw new AuthorizationException('You are not allowed to view this post');
    }

    return view('posts.show', compact('post'));
}

Также имеется возможность использовать хелпер abort() для выбрасывания исключения, чтобы создать исключение с заданным кодом HTTP состояния и дополнительным сообщением. Например:

public function update(Request $request, $id)
{
    $post = Post::find($id);

    if ($post == null) {
        // Прервать с кодом состояния 404 и пользовательским сообщением
        abort(404, 'Post not found');
    }

    if (Auth::user()->cannot('update', $post)) {
        // Прервать с кодом состояния 403 и сообщением по умолчанию
        abort(403);
    }

    // Обновить статью ...
}

На практике часто используется метод abort_if(), тогда условие, код ошибки и само сообщение вмещается в одну строку:

abort_if(! Auth::user()->isAdmin(), 403);

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться