Maison  >  Article  >  cadre php  >  Un article expliquant en détail comment gérer les exceptions dans Laravel

Un article expliquant en détail comment gérer les exceptions dans Laravel

青灯夜游
青灯夜游avant
2022-10-02 06:00:272775parcourir

Un article expliquant en détail comment gérer les exceptions dans Laravel

Dans cet article, nous explorerons l'une des fonctionnalités les plus importantes et les moins discutées du framework Web Laravel - la Gestion des exceptions. Laravel est livré avec un gestionnaire d'exceptions intégré qui vous permet de signaler et de présenter facilement les exceptions de manière conviviale. 异常处理。 Laravel 带有一个内置的异常处理程序,可以让您轻松地以友好的方式报告和呈现异常。

在文章的前半部分,我们将探讨异常处理程序提供的默认设置。 事实上,我们首先会通过默认的 Handler 类来理解 Laravel 是如何处理异常的。

在文章的后半部分,我们将继续介绍如何创建自定义异常处理程序,以便您可以捕获自定义异常。

基本配置

在开始研究异常处理类之前,让我们先来看看几个和异常相关且很重要的参数配置。

打开 config/app.php 文件,并仔细的看看下面的代码片段。

...
...
/*
|--------------------------------------------------------------------------
| 应用的调试模式
|--------------------------------------------------------------------------
|
| 当引用处于调试模式,将会显示错误产生式的详细堆栈信息
| 如果禁用,则只显示一个简单的错误页面
|
*/

'debug' => env('APP_DEBUG', false),
...
...

从参数的名称可以猜到,如果设置为 TRUE,将有利于我们调试应用产生的错误。默认值由 .env 环境变量配置文件中的  APP_DEBUG 参数指定。

在开发环境下,建议你将它设置为 TRUE ,这样,通过清晰的错误堆栈信息,能很快的定位错误产生的原因并修复。 另外,当处于正式环境是,我们需要通过环境变量的配置项来关闭它,当错误产生式将只显示通用的提示页面。

除了将错误显示在页面上,Laravel 也允许你将错误记录到日志文件中。现在,让我们来看看日志相关的配置,打开 config/app.php 文件,并仔细的看看下面的代码片段。

...
...
'log' => env('APP_LOG', 'single'),

'log_level' => env('APP_LOG_LEVEL', 'debug'),
...
...

Laravel 框架中,是使用 Monolog 库来记录日志的。你可以通过上面的配置项来配置 Monolog 库。

默认的日志文件保存路径为 storage/logs/laravel.log,通常情况下,你无需更改它。与此同时,你可以通过  APP_LOG_LEVEL 来指定需要被记录到日志文件的错误级别。

前面介绍了异常和日志的基本配置。

接下来,我们看看 Laravel 应用默认的异常处理类。打开 app/Exceptions/Handler.php 文件.

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * 定义无需报告的异常类型
     *
     * @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\Session\TokenMismatchException::class,
        \Illuminate\Validation\ValidationException::class,
    ];

    /**
     * 报告或者通过日志记录一个异常
     *
     * 可以在这个方法中将异常报告给 Sentry, Bugsnag 等平台
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * 将异常通过 Http 返回
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }

    /**
     * 将认证相关的异常转换为未认证的响应(401)
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
     */
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        return redirect()->guest(route('login'));
    }
}

上面的处理类主要包含2个功能:报告和显示所有的异常信息。

让我们仔细看一眼 report 方法。

/**
 * 报告或记录一个异常。
 *
 * 这是一个将异常发送给 Sentry 和 Bugsnag 等机构的好时机。
 *
 * @param  \Exception  $exception
 * @return void
 */
public function report(Exception $exception)
{
    parent::report($exception);
}

report 方法用于将错误记录到日志文件中。同时,关注一项重要的 dontReport 属性,它列出了所有不应该被记录到日志的异常类别。

接下来,我们介绍 render 方法。

/**
 * 将异常渲染至 HTTP 响应值中。
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    return parent::render($request, $exception);
}

如果说 report 方法是用于记录或报告错误,那么 render 方法是用于将错误渲染显示在屏幕上。事实上,当异常发生时,这个方法决定了哪些内容将被展示给用户。

render 方法也允许你针对不同类别的错误自定义响应值,这部分内容我们将在下一章学习。

最后, unauthenticated 方法处理了 AuthenticationException 异常,你能够在此决定当用户访问了一个未授权页面时所展示的内容。

自定义异常类

在这一节,我们将创建一个自定义异常类,用于处理 CustomException 类别的异常。创建自定义异常类背后的想法是更轻松地管理自定义异常同时显示自定义响应。

开始着手创建一个文件 app/Exceptions/CustomException.php ,内容如下所示。

<?php

namespace App\Exceptions;

use Exception;

class CustomException extends Exception
{
    /**
     * 报告这个异常。
     *
     * @return void
     */
    public function report()
    {
    }

    /**
     * 将异常渲染至 HTTP 响应值中。
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        return response()->view(
                'errors.custom',
                array(
                    'exception' => $this
                )
        );
    }
}

重要的是需要注意 CustomException 类必须继承核心 Exception 类。为了演示用途,我们仅仅讨论了 render 方法,但显然你也能够自定义修改 report 方法。

正如你看到的,在样例中我们将用户重定向至 errors.custom 错误页面。通过这种方式,你能够为特定类型的异常实现自定义的错误页面。

当然,我们需要创建一个关联的视图文件 resources/views/errors/custom.blade.php

Exception details: <b>{{ $exception->getMessage() }}</b>

这是一个相当简单的视图文件,只显示一行错误消息,不过你也可以按照自己希望的方式设计这个视图。

我们也需要在 app/Exceptions/Handler.php 文件的 render 方法中进行一些修改,保证我们的自定义异常类能够被调用。让我们将 app/Exceptions/Handler.php 文件中的 render 方法替换为以下内容。

...
...
/**
 * 将异常渲染至 HTTP 响应值中。
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($exception instanceof \App\Exceptions\CustomException)  {
        return $exception->render($request);
    }

    return parent::render($request, $exception);
}
...
...

正如你所看到的,我们会在 render 方法中首先检查异常的类型。如果异常的类别是 AppExceptionsCustomException ,我们将调用这个类的 render 方法。

一切准备就绪。现在我们创建一个控制  app/Http/Controllers/ExceptionController.php

Dans la première moitié de l'article, nous explorerons les paramètres par défaut fournis par les gestionnaires d'exceptions. En fait, nous comprendrons d’abord comment Laravel gère les exceptions via la classe Handler par défaut. 🎜🎜Dans la seconde moitié de l'article, nous continuerons à vous présenter comment créer un gestionnaire d'exceptions personnalisé afin que vous puissiez détecter les exceptions personnalisées. 🎜

Configuration de base

🎜Avant de commencer à étudier la classe de gestion des exceptions, examinons d'abord plusieurs configurations de paramètres importantes liées aux exceptions. 🎜🎜Ouvrez le fichier config/app.php et examinez de plus près l'extrait de code suivant. 🎜
<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ExceptionController extends Controller
{
    public function index()
    {
        // 出错了,你可以抛出自定义的异常 CustomException
        throw new \App\Exceptions\CustomException('Something Went Wrong.');
    }
}
🎜Comme vous pouvez le deviner d'après le nom du paramètre, s'il est défini sur TRUE, cela nous aidera à déboguer les erreurs générées par l'application. La valeur par défaut est spécifiée par le paramètre APP_DEBUG dans le fichier de configuration des variables d'environnement .env. 🎜🎜Dans l'environnement de développement, il est recommandé de le définir sur TRUE. De cette façon, grâce à des informations claires sur la pile d'erreurs, vous pouvez rapidement localiser la cause de l'erreur et la corriger. De plus, dans l'environnement formel, nous devons le désactiver via l'élément de configuration de la variable d'environnement. Lorsqu'une erreur se produit, seule une page d'invite générale s'affichera. 🎜🎜En plus d'afficher les erreurs sur la page, Laravel vous permet également de consigner les erreurs dans un fichier journal. Examinons maintenant la configuration liée à la journalisation. Ouvrez le fichier config/app.php et examinez de plus près l'extrait de code suivant. 🎜
// Exception routes
Route::get('exception/index', 'ExceptionController@index');
🎜Dans le framework Laravel, la bibliothèque Monolog est utilisée pour enregistrer les logs. Vous pouvez configurer la bibliothèque Monolog via les éléments de configuration ci-dessus. 🎜🎜Le chemin d'enregistrement du fichier journal par défaut est storage/logs/laravel.log. Normalement, vous n'avez pas besoin de le modifier. En même temps, vous pouvez transmettre APP_LOG_LEVEL pour spécifier le niveau d'erreur qui doit être enregistré dans le fichier journal. 🎜🎜La configuration de base des exceptions et des journaux a été introduite plus tôt. 🎜🎜Ensuite, jetons un coup d'œil à la classe de gestion des exceptions par défaut de l'application Laravel. Ouvrez le fichier app/Exceptions/Handler.php 🎜rrreee🎜La classe de traitement ci-dessus contient principalement 2 fonctions : signaler et afficher toutes les informations sur les exceptions. 🎜🎜Regardons de plus près la méthode report. La méthode 🎜rrreee🎜report est utilisée pour enregistrer les erreurs dans un fichier journal. Faites également attention à un attribut important dontReport, qui répertorie toutes les catégories d'exceptions qui ne doivent pas être enregistrées. 🎜🎜Ensuite, nous introduisons la méthode render. 🎜rrreee🎜Si la méthode report est utilisée pour enregistrer ou signaler des erreurs, alors la méthode render est utilisée pour restituer et afficher les erreurs à l'écran. En fait, cette méthode détermine quel contenu sera affiché à l’utilisateur lorsqu’une exception se produit. La méthode 🎜🎜render vous permet également de personnaliser les valeurs de réponse pour différents types d'erreurs, ce que nous apprendrons dans le chapitre suivant. 🎜🎜Enfin, la méthode unauthenticated gère l'exception AuthenticationException, où vous pouvez décider quel contenu afficher lorsque l'utilisateur accède à une page non autorisée. 🎜

Classe d'exception personnalisée

🎜Dans cette section, nous allons créer une classe d'exception personnalisée pour gérer les exceptions de la catégorie CustomException. L'idée derrière la création d'une classe d'exceptions personnalisée est de gérer plus facilement les exceptions personnalisées tout en affichant des réponses personnalisées. 🎜🎜Commencez à créer un fichier app/Exceptions/CustomException.php avec le contenu suivant. 🎜rrreee🎜Il est important de noter que la classe CustomException doit hériter de la classe principale Exception. À des fins de démonstration, nous n'avons abordé que la méthode de rendu, mais vous pouvez évidemment également personnaliser la méthode de rapport. 🎜🎜Comme vous pouvez le voir, dans l'exemple nous redirigeons l'utilisateur vers la page d'erreur errors.custom. De cette façon, vous pouvez implémenter des pages d'erreur personnalisées pour des types spécifiques d'exceptions. 🎜🎜Bien sûr, nous devons créer un fichier de vue associé resources/views/errors/custom.blade.php. 🎜rrreee🎜Il s'agit d'un fichier de vue assez simple qui affiche simplement un message d'erreur d'une ligne, mais vous pouvez concevoir la vue comme vous le souhaitez. 🎜🎜Nous devons également apporter quelques modifications à la méthode de rendu du fichier app/Exceptions/Handler.php pour garantir que notre classe d'exception personnalisée puisse être appelée. Remplaçons la méthode render dans le fichier app/Exceptions/Handler.php par ce qui suit. 🎜rrreee🎜Comme vous pouvez le voir, nous allons d'abord vérifier le type d'exception dans la méthode de rendu. Si la classe de l'exception est AppExceptionsCustomException , nous appellerons la méthode render de cette classe. 🎜🎜Tout est prêt. Nous créons maintenant un contrôle app/Http/Controllers/ExceptionController.php pour tester la classe d'exception personnalisée. 🎜
<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ExceptionController extends Controller
{
    public function index()
    {
        // 出错了,你可以抛出自定义的异常 CustomException
        throw new \App\Exceptions\CustomException('Something Went Wrong.');
    }
}

当然,你需要先在 routes/web.php 文件中添加相关的路由,就像下面一样。

// Exception routes
Route::get('exception/index', 'ExceptionController@index');

之后,你可以浏览 http://your-laravel-site.com/exception/ind... 地址来查看是否和预期的一样。一切正常的话,页面将显示我们前面配置 errors.custom 视图。

就这样,你就可以按自己方式来处理 Laravel 中的异常。
完!尽情享受 Laravel 带来的编码的乐趣吧!

总结

今天,我们认真学习了 Laravel 中的异常处理特性。在文章的开头,我们搜索了 Laravel 提供的一些基础配置,用于显示和报告异常。紧接着,我们简要介绍了默认的异常处理类。

在文章的后半部分,我们通过创建一个自定义异常处理类,演示如何在应用中处理自定义的异常。

对于那些刚刚起步学习 Laravel ,或者期待拓展阅读相关知识、网站、应用扩展的读者,这里有一系列您能够学习的内容,参见 Envato Market 。

期待听到任何形式的咨询或建议!

原文地址:https://code.tutsplus.com/tutorials/exception-handling-in-laravel--cms-30210

译文地址:https://learnku.com/laravel/t/8783/exception-handling-in-laravel

【相关推荐:laravel视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer