Fehler


Fehlerbehandlung

    Einführung
  • Konfiguration
  • Ausnahmebehandler
    • Bericht Methode
    • Rendermethode
    • Reportable & Renderable Exception
  • HTTP Ausnahme
    • Benutzerdefiniertes HTTP Fehlerseite

Einführung

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 viele instanceof-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. reportHilfsfunktionen ermöglichen es Ihnen, Ausnahmen schnell zu melden, ohne eine Fehlerseite anzuzeigen, indem Sie die reportMethoden 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
Dieser Artikel wurde zuerst auf der Website LearnKu.com veröffentlicht.