Heim > PHP-Framework > Laravel > Hauptteil

Ein Artikel, der ausführlich erklärt, wie Ausnahmen in Laravel behandelt werden

青灯夜游
Freigeben: 2022-10-02 06:00:27
nach vorne
2861 Leute haben es durchsucht

Ein Artikel, der ausführlich erklärt, wie Ausnahmen in Laravel behandelt werden

In diesem Artikel werden wir eine der wichtigsten und am wenigsten diskutierten Funktionen des Laravel-Webframeworks untersuchen – Ausnahmebehandlung. Laravel verfügt über einen integrierten Ausnahmehandler, mit dem Sie Ausnahmen einfach melden und auf benutzerfreundliche Weise präsentieren können. 异常处理。 Laravel 带有一个内置的异常处理程序,可以让您轻松地以友好的方式报告和呈现异常。

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

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

基本配置

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

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

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

'debug' => env('APP_DEBUG', false),
...
...
Nach dem Login kopieren

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

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

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

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

'log_level' => env('APP_LOG_LEVEL', 'debug'),
...
...
Nach dem Login kopieren

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'));
    }
}
Nach dem Login kopieren

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

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

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

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);
}
Nach dem Login kopieren

如果说 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
                )
        );
    }
}
Nach dem Login kopieren

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

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

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

Exception details: <b>{{ $exception->getMessage() }}</b>
Nach dem Login kopieren

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

我们也需要在 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);
}
...
...
Nach dem Login kopieren

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

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

In der ersten Hälfte des Artikels werden wir die Standardeinstellungen untersuchen, die von Ausnahmehandlern bereitgestellt werden. Tatsächlich werden wir zunächst verstehen, wie Laravel Ausnahmen über die Standard-Handler-Klasse behandelt. 🎜🎜In der zweiten Hälfte des Artikels stellen wir Ihnen weiterhin vor, wie Sie einen benutzerdefinierten Ausnahmehandler erstellen, damit Sie benutzerdefinierte Ausnahmen abfangen können. 🎜

Grundkonfiguration

🎜Bevor wir mit dem Studium der Ausnahmebehandlungsklasse beginnen, werfen wir zunächst einen Blick auf einige wichtige Parameterkonfigurationen im Zusammenhang mit Ausnahmen. 🎜🎜Öffnen Sie die Datei config/app.php und schauen Sie sich den folgenden Codeausschnitt genauer an. 🎜
<?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.');
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Wie Sie anhand des Namens des Parameters erraten können, hilft er uns, von der Anwendung generierte Fehler zu debuggen, wenn er auf TRUE gesetzt ist. Der Standardwert wird durch den Parameter APP_DEBUG in der Konfigurationsdatei der Umgebungsvariablen .env angegeben. 🎜🎜In der Entwicklungsumgebung wird empfohlen, den Wert auf TRUE zu setzen. Auf diese Weise können Sie durch klare Fehlerstapelinformationen die Fehlerursache schnell lokalisieren und beheben. Darüber hinaus müssen wir es in der formalen Umgebung über das Konfigurationselement der Umgebungsvariablen deaktivieren. Wenn ein Fehler auftritt, wird nur eine allgemeine Eingabeaufforderungsseite angezeigt. 🎜🎜Neben der Anzeige von Fehlern auf der Seite ermöglicht Ihnen Laravel auch, Fehler in einer Protokolldatei zu protokollieren. Schauen wir uns nun die protokollierungsbezogene Konfiguration an. Öffnen Sie die Datei config/app und schauen Sie sich den folgenden Codeausschnitt genauer an. 🎜
// Exception routes
Route::get('exception/index', 'ExceptionController@index');
Nach dem Login kopieren
Nach dem Login kopieren
🎜Im Laravel-Framework wird die Monolog-Bibliothek zum Aufzeichnen von Protokollen verwendet. Sie können die Monolog-Bibliothek über die oben genannten Konfigurationselemente konfigurieren. 🎜🎜Der Standardspeicherpfad für Protokolldateien ist storage/logs/laravel.log. Normalerweise müssen Sie ihn nicht ändern. Gleichzeitig können Sie APP_LOG_LEVEL übergeben, um die Fehlerstufe anzugeben, die in der Protokolldatei aufgezeichnet werden muss. 🎜🎜Die Grundkonfiguration von Ausnahmen und Protokollen wurde bereits früher eingeführt. 🎜🎜Als nächstes werfen wir einen Blick auf die Standard-Ausnahmebehandlungsklasse der Laravel-Anwendung. Öffnen Sie die Datei app/Exceptions/Handler.php 🎜rrreee🎜Die obige Verarbeitungsklasse enthält hauptsächlich zwei Funktionen: Melden und Anzeigen aller Ausnahmeinformationen. 🎜🎜Schauen wir uns die Methode report genauer an. Die 🎜rrreee🎜report-Methode wird verwendet, um Fehler in einer Protokolldatei zu protokollieren. Achten Sie außerdem auf ein wichtiges dontReport-Attribut, das alle Ausnahmekategorien auflistet, die nicht protokolliert werden sollen. 🎜🎜Als nächstes stellen wir die Methode render vor. 🎜rrreee🎜Wenn die Methode report zum Aufzeichnen oder Melden von Fehlern verwendet wird, wird die Methode render zum Rendern und Anzeigen von Fehlern auf dem Bildschirm verwendet. Tatsächlich bestimmt diese Methode, welcher Inhalt dem Benutzer angezeigt wird, wenn eine Ausnahme auftritt. Mit der Methode 🎜🎜render können Sie auch Antwortwerte für verschiedene Fehlertypen anpassen, was wir im nächsten Kapitel erfahren werden. 🎜🎜Schließlich behandelt die Methode unauthenticated die Ausnahme AuthenticationException, bei der Sie entscheiden können, welche Inhalte angezeigt werden sollen, wenn der Benutzer auf eine nicht autorisierte Seite zugreift. 🎜

Benutzerdefinierte Ausnahmeklasse

🎜In diesem Abschnitt erstellen wir eine benutzerdefinierte Ausnahmeklasse, um Ausnahmen der Kategorie CustomException zu behandeln. Die Idee hinter der Erstellung einer benutzerdefinierten Ausnahmeklasse besteht darin, benutzerdefinierte Ausnahmen einfacher zu verwalten und gleichzeitig benutzerdefinierte Antworten anzuzeigen. 🎜🎜Beginnen Sie mit der Erstellung einer Datei app/Exceptions/CustomException.php mit dem folgenden Inhalt. 🎜rrreee🎜Es ist wichtig zu beachten, dass die Klasse CustomException die Kernklasse Exception erben muss. Zu Demonstrationszwecken haben wir nur die Rendermethode besprochen, aber natürlich können Sie auch die Berichtsmethode anpassen. 🎜🎜Wie Sie sehen können, leiten wir den Benutzer im Beispiel auf die Fehlerseite errors.custom um. Auf diese Weise können Sie benutzerdefinierte Fehlerseiten für bestimmte Ausnahmetypen implementieren. 🎜🎜Natürlich müssen wir eine zugehörige Ansichtsdatei resources/views/errors/custom.blade.php erstellen. 🎜rrreee🎜Dies ist eine ziemlich einfache Ansichtsdatei, die nur eine einzeilige Fehlermeldung anzeigt, aber Sie können die Ansicht nach Ihren Wünschen gestalten. 🎜🎜Wir müssen außerdem einige Änderungen an der Render-Methode der Datei app/Exceptions/Handler.php vornehmen, um sicherzustellen, dass unsere benutzerdefinierte Ausnahmeklasse aufgerufen werden kann. Ersetzen wir die Render-Methode in der Datei app/Exceptions/Handler.php durch Folgendes. 🎜rrreee🎜Wie Sie sehen, prüfen wir zunächst die Art der Ausnahme in der Render-Methode. Wenn die Klasse der Ausnahme AppExceptionsCustomException ist, rufen wir die Rendermethode dieser Klasse auf. 🎜🎜Alles ist bereit. Jetzt erstellen wir ein Steuerelement app/Http/Controllers/ExceptionController.php, um die benutzerdefinierte Ausnahmeklasse zu testen. 🎜
<?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.');
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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

// Exception routes
Route::get('exception/index', 'ExceptionController@index');
Nach dem Login kopieren
Nach dem Login kopieren

之后,你可以浏览 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视频教程

Das obige ist der detaillierte Inhalt vonEin Artikel, der ausführlich erklärt, wie Ausnahmen in Laravel behandelt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!