erreur


Exception handler

  • Report method
  • Render method
  • Reportable & Renderable Exception
    • HTTP exception
    • Custom HTTP error page
    • 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 类处理的。这个类包含两个方法: reportrender 。我们将详细剖析这些方法。 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

Pour le développement local, vous devez définir la valeur de la variable d'environnement 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.

Gestionnaire d'exceptions🎜🎜🎜🎜 < div name="2e60ae" data-unique="2e60ae">🎜

Méthode de rapport

🎜Toutes les exceptions sont gérées par la classe AppExceptionsHandler. 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 reportinstanceof 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éthode context 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 异常

除了在异常处理器的 reportrender 方法中检查异常类型,你还可以直接在自定义异常上定义 reportrender 方法。当定义了这些方法时,它们会被框架自动调用:

<h2>{{ $exception->getMessage() }}</h2>

{tip} 你可以声明 report 方法和必要参数,它们将通过 Laravel 的 服务容器 自动注入方法中

HTTP 异常

一些异常用于描述产生自服务器的 HTTP 错误代码。例如,「页面未找到」错误 (404),  「未经授权的错误」(401) ,甚至可以是开发人员引起的 500 错误。 你可以使用 abort 辅助函数从应用程序的任何地方生成这样的响应:

php artisan vendor:publish --tag=laravel-errors

辅助函数 abort 会立即引发一个由异常处理器渲染的异常。你还可选择性地提供响应文本:

rrreee

自定义 HTTP 错误页面

Laravel 可以轻松显示各种 HTTP 状态代码的自定义错误页面。例如,如果你希望自定义 404 HTTP 状态码的错误页面,可以创建一个 resources/views/errors/404.blade.php 视图文件。该文件将被用于你的应用程序产生的所有 404 错误。此目录中的视图文件的命名应匹配它们对应的 HTTP 状态码。由 abort 函数引发的 HttpException 实例将作为 $exception 变量传递给视图:

rrreee

你可以使用 vendor:publishrrreee

Exceptions pouvant être signalées et rendues
🎜En plus de vérifier le type d'exception dans les méthodes 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🎜. 🎜🎜