erreur
- Report method
- Render method
- Reportable & Renderable Exception
- Présentation Lorsque vous démarrez un nouveau projet Laravel, la gestion des erreurs et des exceptions est déjà configurée pour vous. la classe se charge d'enregistrer toutes les exceptions déclenchées par l'application et de les présenter à l'utilisateur. Dans ce document, nous explorerons cette classe en profondeur.
Configuration
L'option debug
dans votre fichier de configuration config/app.php
détermine la quantité d'informations qui sera réellement affichée à l'utilisateur en cas d'erreur. Par défaut, le paramétrage de cette option respectera la valeur de la variable d'environnement APP_DEBUG
stockée dans le fichier .env
. config/app.php
配置文件中的 debug
选项决定了对于一个错误实际上将显示多少信息给用户。默认情况下,该选项的设置将遵照存储在 .env
文件中的 APP_DEBUG
环境变量的值。
对于本地开发,你应该将 APP_DEBUG
环境变量的值设置为 true
。在生产环境中,该值应始终为 false
。如果在生产中将该值设置为 true
,则可能会将敏感配置值暴露给应用程序的终端用户。
异常处理器
Report 方法
所有异常都是由 AppExceptionsHandler
类处理的。这个类包含两个方法: report
和 render
。我们将详细剖析这些方法。 report
方法用于记录异常或将它们发送给如 Bugsnag 或 Sentry 等外部服务。默认情况下, report
方法将异常传递给记录异常的基类。不过,你可以任何自己喜欢的方式来记录异常。
例如,如果你需要以不同方式报告不同类型的异常,则可以使用 PHP 的 instanceof
比较运算符:
/** * 报告或记录异常 * * 此处是发送异常给 Sentry、Bugsnag 等外部服务的好位置。 * * @param \Exception $exception * @return void */ public function report(Exception $exception){ if ($exception instanceof CustomException) { // } parent::report($exception); }
{tip} 不要在
report
方法中进行太多的instanceof
检查,而应考虑使用 可报告异常(Reportable exception) 。
全局日志
在正常情况下, Laravel 会自动将当前用户的 ID 作为数据添加到每一条异常日志中。 你可以在通过重写 AppExceptionsHandler
类中的 context
方法来定义你的全局环境变量。 之后,这个变量将包含在每一条异常日志中:
/** * 定义默认的环境变量 * * @return array */ protected function context(){ return array_merge(parent::context(), [ 'foo' => 'bar', ]); }
report
辅助函数
有时你可能需要报告异常,但又不希望终止当前请求的处理。 report
辅助函数允许你使用异常处理器的 report
方法在不显示错误页面的情况下快速报告异常:
public function isValid($value){ try { // 验证值... } catch (Exception $e) { report($e); return false; } }
按类型忽略异常
异常处理器的 $dontReport
APP_DEBUG
sur true
. Dans un environnement de production, cette valeur doit toujours être false
. Si vous définissez cette valeur sur true
en production, vous pouvez exposer des valeurs de configuration sensibles aux utilisateurs finaux de votre application. Méthode de rapport
🎜Toutes les exceptions sont gérées par la classeAppExceptionsHandler
. Cette classe contient deux méthodes : report
et render
. Nous allons décortiquer ces méthodes en détail. La méthode report
est utilisée pour journaliser les exceptions ou les envoyer à un service externe tel que Bugsnag ou Sentry. Par défaut, la méthode report
transmet l'exception à la classe de base qui enregistre l'exception. Cependant, vous pouvez enregistrer les exceptions comme bon vous semble. 🎜🎜Par exemple, si vous devez signaler différents types d'exceptions différemment, vous pouvez utiliser l'opérateur de comparaison instanceof
de PHP : 🎜/** * 不应被报告的异常类型清单。 * * @var array */protected $dontReport = [ \Illuminate\Auth\AuthenticationException::class, \Illuminate\Auth\Access\AuthorizationException::class, \Symfony\Component\HttpKernel\Exception\HttpException::class, \Illuminate\Database\Eloquent\ModelNotFoundException::class, \Illuminate\Validation\ValidationException::class,];
🎜{tip} Ne pas utiliser report There y a-t-il trop de vérifications instanceof
dans le code> ; envisagez plutôt d'utiliser des exceptions rapportables. 🎜
Journal global
🎜Dans des circonstances normales, Laravel ajoutera automatiquement l'ID de l'utilisateur actuel en tant que données à chaque entrée du journal des exceptions. Vous pouvez définir vos variables d'environnement globales en remplaçant la méthodecontext
dans la classe AppExceptionsHandler
. Ensuite, cette variable sera incluse dans chaque journal d'exceptions : 🎜/** * 将异常转换为 HTTP 响应。 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception){ if ($exception instanceof CustomException) { return response()->view('errors.custom', [], 500); } return parent::render($request, $exception); }
report
fonction d'assistance
🎜Parfois, vous Vous devrez peut-être signaler une exception mais vous ne souhaitez pas mettre fin au traitement de la demande en cours. La fonction d'assistance report
vous permet de signaler rapidement des exceptions sans afficher de page d'erreur à l'aide de la méthode report
du gestionnaire d'exceptions : 🎜<?php namespace App\Exceptions;use Exception; class RenderException extends Exception{ /** * 报告异常 * * @return void */ public function report() { // } /** * 转换异常为 HTTP 响应 * * @param \Illuminate\Http\Request * @return \Illuminate\Http\Response */ public function render($request) { return response(...); } }
Ignorer les exceptions par type
🎜L'attribut$dontReport
du gestionnaire d'exceptions contient un ensemble de types d'exceptions qui ne seront pas enregistrés. Par exemple, les exceptions provoquées par des erreurs 404 et plusieurs autres types d'erreurs ne sont pas écrites dans le fichier journal. Vous pouvez ajouter d'autres types d'exceptions à ce tableau selon vos besoins : 🎜abort(404);🎜🎜🎜🎜🎜🎜
Méthode Render
La méthode render
est chargée de convertir l'exception donnée en une réponse HTTP qui sera renvoyée au navigateur. Par défaut, les exceptions sont transmises à la classe de base qui génère la réponse pour vous. Cependant, vous pouvez vérifier le type d'exception ou renvoyer votre propre réponse personnalisée si vous le souhaitez : render
方法负责将给定的异常转换为将被发送回浏览器的 HTTP 响应。默认情况下,异常将传递给为你生成响应的基类。不过,你可以按自己意愿检查异常类型或返回自己的自定义响应:
abort(403, 'Unauthorized action.');
Reportable & Renderable 异常
除了在异常处理器的 report
和 render
方法中检查异常类型,你还可以直接在自定义异常上定义 report
和 render
方法。当定义了这些方法时,它们会被框架自动调用:
<h2>{{ $exception->getMessage() }}</h2>
{tip} 你可以声明
report
方法和必要参数,它们将通过 Laravel 的 服务容器 自动注入方法中
HTTP 异常
一些异常用于描述产生自服务器的 HTTP 错误代码。例如,「页面未找到」错误 (404), 「未经授权的错误」(401) ,甚至可以是开发人员引起的 500 错误。 你可以使用 abort
辅助函数从应用程序的任何地方生成这样的响应:
php artisan vendor:publish --tag=laravel-errors
辅助函数 abort
会立即引发一个由异常处理器渲染的异常。你还可选择性地提供响应文本:
自定义 HTTP 错误页面
Laravel 可以轻松显示各种 HTTP 状态代码的自定义错误页面。例如,如果你希望自定义 404 HTTP 状态码的错误页面,可以创建一个 resources/views/errors/404.blade.php
视图文件。该文件将被用于你的应用程序产生的所有 404 错误。此目录中的视图文件的命名应匹配它们对应的 HTTP 状态码。由 abort
函数引发的 HttpException
实例将作为 $exception
变量传递给视图:
你可以使用 vendor:publish
rrreee
report
et render
du gestionnaire d'exceptions, vous pouvez également définir directement report< sur le Méthodes d'exception personnalisées /code> et render
. Lorsque ces méthodes seront définies, elles seront automatiquement appelées par le framework : 🎜rrreee🎜{tip} Vous pouvez déclarer la méthode report
et les paramètres nécessaires, et ils seront automatiquement injectés dans la méthode via le conteneur de services de Laravel 🎜
🎜🎜🎜🎜Exceptions HTTP
🎜Quelques exceptions sont utilisés pour décrire l'occurrence du code d'erreur HTTP du serveur. Par exemple, les erreurs « Page non trouvée » (404), « Erreurs non autorisées » (401), ou encore 500 erreurs provoquées par les développeurs. Vous pouvez utiliser la fonction d'assistance abort
pour générer une réponse comme celle-ci depuis n'importe où dans votre application : 🎜rrreee🎜La fonction d'assistance abort
déclenche immédiatement une exception rendue par un gestionnaire d'exceptions. Vous pouvez également éventuellement fournir un texte de réponse : 🎜rrreee🎜🎜🎜🎜🎜Pages d'erreur HTTP personnalisées🎜🎜 Laravel peut facilement afficher des pages d'erreur personnalisées pour divers codes d'état HTTP. Par exemple, si vous souhaitez personnaliser la page d'erreur pour les codes d'état HTTP 404, vous pouvez créer un fichier de vue resources/views/errors/404.blade.php
. Ce fichier sera utilisé pour toutes les erreurs 404 générées par votre application. Les fichiers d'affichage de ce répertoire doivent être nommés pour correspondre à leurs codes d'état HTTP correspondants. Les instances de HttpException
déclenchées par la fonction abort
seront transmises à la vue en tant que variable $exception
: 🎜rrreee🎜Vous pouvez utiliser supplier:publish< /code> Commande artisanale pour définir les pages de modèle d'erreur. Une fois la page modèle générée, vous pouvez personnaliser le contenu de la page modèle : 🎜rrreee🎜Cet article a été publié pour la première fois sur le site Web 🎜LearnKu.com🎜. 🎜🎜
🎜En plus de vérifier le type d'exception dans les méthodes