Fehler
Wenn Sie etwas Neues beginnen Wenn Sie ein Laravel-Projekt verwenden, ist die Fehler- und Ausnahmebehandlung bereits für Sie konfiguriert. Die Klasse
ist dafür verantwortlich, alle von der Anwendung ausgelösten Ausnahmen aufzuzeichnen und dem Benutzer anzuzeigen. In diesem Dokument werden wir uns eingehend mit dieser Klasse befassen.AppExceptionsHandler
Konfiguration
Die config/app.php
-Optionen in Ihrer debug
-Konfigurationsdatei legen fest, wie viele Informationen dem Benutzer bei einem Fehler tatsächlich angezeigt werden. Standardmäßig berücksichtigt die Einstellung dieser Option den Wert der Umgebungsvariablen .env
, die in der Datei APP_DEBUG
gespeichert ist.
Für die lokale Entwicklung sollten Sie den Wert der Umgebungsvariablen APP_DEBUG
auf true
setzen. In einer Produktionsumgebung sollte dieser Wert immer false
sein. Wenn Sie diesen Wert in der Produktion auf true
festlegen, können Sie den Endbenutzern Ihrer Anwendung vertrauliche Konfigurationswerte zugänglich machen.
Ausnahmebehandler
Bericht Methode
Alle Ausnahmen werden von der Klasse AppExceptionsHandler
behandelt. Diese Klasse enthält zwei Methoden: report
und render
. Wir werden diese Methoden im Detail analysieren. Die Methode report
wird verwendet, um Ausnahmen zu protokollieren oder an externe Dienste wie Bugsnag oder Sentry zu senden. Standardmäßig übergibt die Methode report
die Ausnahme an die Basisklasse, die die Ausnahme protokolliert. Sie können Ausnahmen jedoch beliebig protokollieren.
Wenn Sie beispielsweise verschiedene Arten von Ausnahmen unterschiedlich melden müssen, können Sie den instanceof
-Vergleichsoperator von PHP verwenden:
/** * 报告或记录异常 * * 此处是发送异常给 Sentry、Bugsnag 等外部服务的好位置。 * * @param \Exception $exception * @return void */ public function report(Exception $exception){ if ($exception instanceof CustomException) { // } parent::report($exception); }
{tip} Verwenden Sie dort nicht
report
Es gibt zu vieleinstanceof
-Prüfungen in der Methode. Erwägen Sie stattdessen die Verwendung einer meldepflichtigen Ausnahme.
Globales Protokoll
Unter normalen Umständen fügt Laravel jedem Ausnahmeprotokoll automatisch die ID des aktuellen Benutzers als Daten hinzu. Sie können Ihre globalen Umgebungsvariablen definieren, indem Sie die Methode AppExceptionsHandler
in der Klasse context
überschreiben. Anschließend wird diese Variable in jedes Ausnahmeprotokoll aufgenommen:
/** * 定义默认的环境变量 * * @return array */ protected function context(){ return array_merge(parent::context(), [ 'foo' => 'bar', ]); }
report
Hilfsfunktion
Manchmal müssen Sie möglicherweise eine Ausnahme melden, möchten dies aber nicht Beenden Sie die aktuelle Bearbeitung von Anfragen. report
Hilfsfunktionen ermöglichen es Ihnen, Ausnahmen schnell zu melden, ohne eine Fehlerseite anzuzeigen, indem Sie die report
Methoden des Ausnahmehandlers verwenden:
public function isValid($value){ try { // 验证值... } catch (Exception $e) { report($e); return false; } }
Ausnahmen nach Typ ignorieren
Die Ausnahme Das $dontReport
-Attribut des Handlers enthält eine Reihe von Ausnahmetypen, die nicht protokolliert werden. Beispielsweise werden Ausnahmen, die durch 404-Fehler und verschiedene andere Fehlertypen verursacht werden, nicht in die Protokolldatei geschrieben. Sie können diesem Array nach Bedarf weitere Ausnahmetypen hinzufügen:
/** * 不应被报告的异常类型清单。 * * @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,];
Render-Methode Die
render
-Methode ist dafür verantwortlich, die gegebene Ausnahme in eine HTTP-Antwort umzuwandeln, die an den Browser zurückgesendet wird. Standardmäßig werden Ausnahmen an die Basisklasse übergeben, die die Antwort für Sie generiert. Sie können jedoch den Ausnahmetyp überprüfen oder bei Bedarf Ihre eigene benutzerdefinierte Antwort zurückgeben:
/** * 将异常转换为 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); }
Meldebare und darstellbare Ausnahmen
außer report
und render
in Ausnahmehandlern Überprüfen Sie den Ausnahmetyp in der Methode. Sie können die Methoden report
und render
auch direkt für benutzerdefinierte Ausnahmen definieren. Wenn diese Methoden definiert sind, werden sie automatisch vom Framework aufgerufen:
<?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(...); } }
{tip} Sie können die
report
-Methode und die erforderlichen Parameter deklarieren, die über den Service-Container von Laravel übergeben werden Bei der automatischen Injektionsmethode
HTTP-Ausnahme
Einige Ausnahmen werden zur Beschreibung von generierten HTTP-Fehlern verwendet der Servercode. Zum Beispiel „Seite nicht gefunden“-Fehler (404), „Unautorisierte Fehler“ (401) oder sogar 500 von Entwicklern verursachte Fehler. Sie können die Hilfsfunktion abort
verwenden, um von überall in Ihrer Anwendung eine Antwort wie diese zu generieren:
abort(404);
Die Hilfsfunktion abort
löst sofort eine Ausnahme aus, die von einem Ausnahmehandler gerendert wird. Optional können Sie auch einen Antworttext angeben:
abort(403, 'Unauthorized action.');
Benutzerdefinierte HTTP-Fehlerseite
Laravel kann den benutzerdefinierten Fehler problemlos anzeigen Seiten für verschiedene HTTP-Statuscodes. Wenn Sie beispielsweise die Fehlerseite für 404-HTTP-Statuscodes anpassen möchten, können Sie eine resources/views/errors/404.blade.php
-Ansichtsdatei erstellen. Diese Datei wird für alle von Ihrer Anwendung generierten 404-Fehler verwendet. Ansichtsdateien in diesem Verzeichnis sollten so benannt werden, dass sie mit ihren entsprechenden HTTP-Statuscodes übereinstimmen. Die von der Funktion abort
ausgelöste HttpException
-Instanz wird als $exception
-Variable an die Ansicht übergeben:
<h2>{{ $exception->getMessage() }}</h2>
Sie können den Befehl vendor:publish
Artisan verwenden, um Fehlervorlagenseiten zu definieren. Nachdem die Vorlagenseite generiert wurde, können Sie den Inhalt der Vorlagenseite anpassen:
php artisan vendor:publish --tag=laravel-errors