Исключения — это ошибки, возникающие во время выполнения программы и нарушающие нормальный поток управления.
В процессе разработки может возникнуть необходимость генерировать/выбросить исключение вручную, в коде приложения, т.е. указать, что что-то пошло не так или что какое-то условие не было выполнено. Например, нет такой страницы, или пользователь не авторизован, попытка доступа к несуществующему свойству объекта, деление на ноль или вызов функции с недопустимыми аргументами — это всё примеры исключений.
Исключения могут создавать сами механизмы PHP (например, ParseError
или TypeError
) или кодом приложения (например, InvalidArgumentException
или ModelNotFoundException
). Исключение также могут быть определены пользователем путём расширения базового класса Exception
или любого из его подклассов.
В новом проекте 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, можно использовать ключевое слово 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);
Практика