Heim  >  Artikel  >  PHP-Framework  >  Was sind die Ausnahmen in Laravel?

Was sind die Ausnahmen in Laravel?

青灯夜游
青灯夜游Original
2022-06-28 17:53:332662Durchsuche

Zu den Ausnahmen in Laravel gehören: 1. „E_ERROR“ schwerwiegender Laufzeitfehler, der nicht behebbar ist und dazu führt, dass das Skript beendet wird und nicht weiter ausgeführt wird; 2. „E_WARNING“ Laufzeitwarnung „nicht schwerwiegender Fehler“; 4. Schwerwiegender Fehler „E_CORE_ERROR“, der während der Initialisierung und beim Start auftritt. 5. Schwerwiegender Fehler „E_RECOVERABLE_ERROR“, der erfasst werden kann.

Was sind die Ausnahmen in Laravel?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, Laravel 9-Version, DELL G3-Computer.

Ausnahmestufe in Laravel

Konstante Beschreibung
E_ERROR Schwerwiegender Laufzeitfehler. Bei dieser Art von Fehler handelt es sich im Allgemeinen um eine nicht behebbare Situation, beispielsweise um ein Problem, das durch die Speicherzuweisung verursacht wird. Die Folge ist, dass das Skript beendet wird und nicht weiter ausgeführt wird.
E_WARNING Laufzeitwarnung (nicht schwerwiegender Fehler). Es wird nur eine Eingabeaufforderung angezeigt, das Skript wird jedoch nicht beendet.
E_PARSE Syntaxparsingfehler bei der Kompilierung. Parsing-Fehler werden nur vom Parser generiert.
E_NOTICE Laufzeitbenachrichtigung. Zeigt an, dass das Skript auf eine Situation stößt, die möglicherweise als Fehler erscheint. Es kann jedoch auch zu ähnlichen Benachrichtigungen in Skripten kommen, die normal ausgeführt werden können.
E_CORE_ERROR Schwerwiegender Fehler ist beim Start der PHP-Initialisierung aufgetreten. Dieser Fehler ähnelt E_ERROR, wird jedoch vom Kern der PHP-Engine generiert.
E_CORE_WARNING Warnung (nicht schwerwiegender Fehler) ist beim Start der PHP-Initialisierung aufgetreten. Wie E_WARNING, aber vom PHP-Engine-Kern generiert.
E_COMPILE_ERROR Schwerwiegender Fehler bei der Kompilierung. Ähnlich wie E_ERROR, aber von der Zend-Skript-Engine generiert.
E_COMPILE_WARNING Kompilierungszeitwarnung (nicht schwerwiegender Fehler). Wie E_WARNING, aber von der Zend-Skript-Engine generiert.
E_USER_ERROR Benutzergenerierte Fehlermeldung. Ähnlich wie E_ERROR, wird jedoch vom Benutzer mithilfe der PHP-Funktion trigger_error() im Code generiert.
E_USER_WARNING Benutzergenerierte Warnmeldung. Ähnlich wie E_WARNING, wird jedoch vom Benutzer mithilfe der PHP-Funktion trigger_error() im Code generiert.
E_USER_NOTICE Vom Benutzer generierte Benachrichtigungsinformationen. Ähnlich wie E_NOTICE, wird jedoch vom Benutzer mithilfe der PHP-Funktion trigger_error() im Code generiert.
E_STRICT Aktivieren Sie PHPs Vorschläge für Codeänderungen, um die beste Interoperabilität und Vorwärtskompatibilität des Codes sicherzustellen.
E_RECOVERABLE_ERROR Ein schwerwiegender Fehler, der abgefangen werden kann. Es weist darauf hin, dass ein potenziell gefährlicher Fehler aufgetreten ist, die PHP-Engine jedoch noch nicht in einem instabilen Zustand ist. Wenn der Fehler nicht von einem benutzerdefinierten Handler abgefangen wird (siehe set_error_handler ()), wird er zu E_ERROR und das Skript wird beendet.
E_DEPRECATED Laufzeitbenachrichtigung. Wenn diese Option aktiviert ist, wird eine Warnung vor Code ausgegeben, der in zukünftigen Versionen möglicherweise nicht ordnungsgemäß funktioniert.
E_USER_DEPRECATED Warnmeldung für geringe Benutzerausgabe. Ähnlich wie E_DEPRECATED, wird jedoch vom Benutzer mithilfe der PHP-Funktion trigger_error() im Code generiert.
E_ALL Warnmeldung für geringe Benutzerausgabe. Ähnlich wie E_DEPRECATED, wird jedoch vom Benutzer mithilfe der PHP-Funktion trigger_error() im Code generiert.

Laravel-Ausnahmebehandlung

Die Ausnahmebehandlung von Laravel wird durch die Klasse IlluminateFoundationBootstrapHandleExceptions::class:

class HandleExceptions
{
    public function bootstrap(Application $app)
    {
        $this->app = $app;

        error_reporting(-1);

        set_error_handler([$this, 'handleError']);

        set_exception_handler([$this, 'handleException']);

        register_shutdown_function([$this, 'handleShutdown']);

        if (! $app->environment('testing')) {
            ini_set('display_errors', 'Off');
        }
    }
}

Ausnahmekonvertierung

Die Ausnahmebehandlung von Laravel wird vollständig von der Funktion handleException übernommen.

PHP7 implementiert eine globale ausführbare Schnittstelle. Die ursprüngliche Ausnahme und einige Fehler implementieren diese Schnittstelle und definieren die Vererbungsstruktur von Ausnahmen in Form von Schnittstellen. Dadurch werden mehr Fehler in PHP7 zu abfangbaren Ausnahmen und werden an Entwickler zurückgegeben. Wenn sie nicht abgefangen werden, handelt es sich um Fehler. Wenn sie abgefangen werden, werden sie zu Ausnahmen, die innerhalb des Programms behandelt werden können. Bei diesen abfangbaren Fehlern handelt es sich in der Regel um Fehler, die dem Programm keinen schwerwiegenden Schaden zufügen, beispielsweise eine nicht vorhandene Funktion.

In PHP7 werden 5 neue Engine-Ausnahmen basierend auf der /Error-Ausnahme abgeleitet: ArithmeticError / AssertionError / DivisionByZeroError / ParseError / TypeError. In PHP7 implementieren sowohl die alte /Exception als auch die neue /Error eine gemeinsame Schnittstelle: /Throwable.

Wenn Sie also auf eine Ausnahme vom Typ „Nicht-Ausnahme“ stoßen, müssen Sie diese zunächst in einen Typ „FatalThrowableError“ konvertieren:

public function handleException($e)
{
    if (! $e instanceof Exception) {
        $e = new FatalThrowableError($e);
    }

    $this->getExceptionHandler()->report($e);

    if ($this->app->runningInConsole()) {
        $this->renderForConsole($e);
    } else {
        $this->renderHttpResponse($e);
    }
}

FatalThrowableError ist eine Fehlerausnahmeklasse, die Symfony von ErrorException erbt:

class FatalThrowableError extends FatalErrorException
{
    public function __construct(\Throwable $e)
    {
        if ($e instanceof \ParseError) {
            $message = 'Parse error: '.$e->getMessage();
            $severity = E_PARSE;
        } elseif ($e instanceof \TypeError) {
            $message = 'Type error: '.$e->getMessage();
            $severity = E_RECOVERABLE_ERROR;
        } else {
            $message = $e->getMessage();
            $severity = E_ERROR;
        }

        \ErrorException::__construct(
            $message,
            $e->getCode(),
            $severity,
            $e->getFile(),
            $e->getLine()
        );

        $this->setTrace($e->getTrace());
    }
}

Exception Log

Wenn ein Es ist eine Ausnahme aufgetreten. Zu diesem Zeitpunkt zeichnet Laravel zunächst das Protokoll auf. Dies ist die Rolle der Berichtsfunktion.

protected function getExceptionHandler()
{
    return $this->app->make(ExceptionHandler::class);
}

laravels Standard-Ausnahmebehandlungsklasse im Ioc-Container ist IlluminateFoundationExceptionsHandler:

class Handler implements ExceptionHandlerContract
{
    public function report(Exception $e)
    {
        if ($this->shouldntReport($e)) {
            return;
        }
        try {
            $logger = $this->container->make(LoggerInterface::class);
        } catch (Exception $ex) {
            throw $e; // throw the original exception
        }
        $logger->error($e);
    }
    protected function shouldntReport(Exception $e)
    {
        $dontReport = array_merge($this->dontReport, [HttpResponseException::class]);
        return ! is_null(collect($dontReport)->first(function ($type) use ($e) {
            return $e instanceof $type;
        }));
    }
}

Anzeige der Ausnahmeseite

Nach dem Aufzeichnen des Protokolls muss die Ausnahme in eine Seite konvertiert werden, um dem Entwickler die Ausnahmeinformationen anzuzeigen, damit die Quelle Das Problem kann angezeigt werden:

protected function renderHttpResponse(Exception $e)
{
    $this->getExceptionHandler()->render($this->app['request'], $e)->send();
}
class Handler implements ExceptionHandlerContract
{
    public function render($request, Exception $e)
    {
        $e = $this->prepareException($e);
        if ($e instanceof HttpResponseException) {
            return $e->getResponse();
        } elseif ($e instanceof AuthenticationException) {
            return $this->unauthenticated($request, $e);
        } elseif ($e instanceof ValidationException) {
            return $this->convertValidationExceptionToResponse($e, $request);
        }
        return $this->prepareResponse($request, $e);
    }
}

Laravel behandelt verschiedene Ausnahmen unterschiedlich, einschließlich HttpException, HttpResponseException, AuthorizationException, ModelNotFoundException, AuthenticationException und ValidationException. Da bestimmte Ausnahmen ihre eigenen unterschiedlichen Anforderungen haben, werden sie in diesem Artikel nicht speziell vorgestellt. In diesem Artikel wird weiterhin die Behandlung der häufigsten Ausnahme HttpException vorgestellt:

protected function prepareResponse($request, Exception $e)
{
    if ($this->isHttpException($e)) {
        return $this->toIlluminateResponse($this->renderHttpException($e), $e);
    } else {
        return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
    }
}
protected function renderHttpException(HttpException $e)
{
    $status = $e->getStatusCode();
    view()->replaceNamespace('errors', [
        resource_path('views/errors'),
        __DIR__.'/views',
    ]);
    if (view()->exists("errors::{$status}")) {
        return response()->view("errors::{$status}", ['exception' => $e], $status, $e->getHeaders());
    } else {
        return $this->convertExceptionToResponse($e);
    }
}

Für HttpException werden je nach Fehlerstatuscode unterschiedliche Fehlerseitenvorlagen ausgewählt. Wenn keine relevante Vorlage vorhanden ist, wird die Ausnahmeseite über SymfonyResponse erstellt :

protected function convertExceptionToResponse(Exception $e)
{
    $e = FlattenException::create($e);
    $handler = new SymfonyExceptionHandler(config('app.debug'));
    return SymfonyResponse::create($handler->getHtml($e), $e->getStatusCode(), $e->getHeaders());
}
protected function toIlluminateResponse($response, Exception $e)
{
    if ($response instanceof SymfonyRedirectResponse) {
        $response = new RedirectResponse($response->getTargetUrl(), $response->getStatusCode(), $response->headers->all());
    } else {
        $response = new Response($response->getContent(), $response->getStatusCode(), $response->headers->all());
    }
    return $response->withException($e);
}

【Verwandte Empfehlung:Laravel-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas sind die Ausnahmen in Laravel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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
Vorheriger Artikel:Was ist Laravel Forge?Nächster Artikel:Was ist Laravel Forge?