Maison  >  Article  >  cadre php  >  Quelles sont les exceptions dans Laravel

Quelles sont les exceptions dans Laravel

青灯夜游
青灯夜游original
2022-06-28 17:53:332661parcourir

Les exceptions dans Laravel incluent : 1. "E_ERROR" erreur d'exécution fatale, qui est irrécupérable et entraînera l'arrêt du script et l'arrêt de son exécution ; 2. "E_WARNING" avertissement d'exécution "erreur non fatale" ; 3. "E_PARSE" ; Erreur d'analyse de syntaxe de compilation ; 4. Erreur fatale "E_CORE_ERROR" qui se produit lors de l'initialisation et du démarrage ; 5. Erreur fatale de compilation "E_COMPILE_ERROR" 6. Erreur fatale "E_RECOVERABLE_ERROR" qui peut être capturée.

Quelles sont les exceptions dans Laravel

L'environnement d'exploitation de ce tutoriel : système Windows 7, version Laravel 9, ordinateur DELL G3.

Niveau d'exception dans Laravel

Constant Description
E_ERROR Erreur d'exécution fatale. Ce type d'erreur est généralement une situation irrécupérable, comme un problème causé par l'allocation de mémoire. La conséquence est que le script se termine et ne continue pas à s'exécuter.
E_WARNING Avertissement d'exécution (erreur non fatale). Seul un message d'invite est émis, mais le script ne se termine pas.
E_PARSE Erreur d'analyse de la syntaxe au moment de la compilation. Les erreurs d'analyse sont générées uniquement par l'analyseur.
E_NOTICE Notification d'exécution. Indique que le script rencontre une situation qui peut apparaître comme une erreur, mais il peut également y avoir des notifications similaires dans les scripts qui peuvent s'exécuter normalement.
E_CORE_ERROR Une erreur fatale s'est produite lors du démarrage de l'initialisation de PHP. Cette erreur est similaire à E_ERROR, mais est générée par le cœur du moteur PHP.
E_CORE_WARNING Un avertissement (erreur non fatale) s'est produit lors du démarrage de l'initialisation de PHP. Comme E_WARNING, mais généré par le noyau du moteur PHP.
E_COMPILE_ERROR Erreur fatale à la compilation. Similaire à E_ERROR, mais généré par le moteur de script Zend.
E_COMPILE_WARNING Avertissement lors de la compilation (erreur non fatale). Comme E_WARNING, mais généré par le moteur de script Zend.
E_USER_ERROR Message d'erreur généré par l'utilisateur. Similaire à E_ERROR, mais est généré par l'utilisateur à l'aide de la fonction PHP trigger_error() dans le code.
E_USER_WARNING Message d'avertissement généré par l'utilisateur. Similaire à E_WARNING, mais est généré par l'utilisateur à l'aide de la fonction PHP trigger_error() dans le code.
E_USER_NOTICE Informations de notification générées par l'utilisateur. Similaire à E_NOTICE, mais est généré par l'utilisateur à l'aide de la fonction PHP trigger_error() dans le code.
E_STRICT Activez les suggestions de PHP pour les modifications de code afin de garantir la meilleure interopérabilité et la compatibilité ascendante du code.
E_RECOVERABLE_ERROR Une erreur fatale qui peut être détectée. Cela indique qu'une erreur potentiellement dangereuse s'est produite, mais n'a pas encore laissé le moteur PHP dans un état instable. Si l'erreur n'est pas détectée par un gestionnaire défini par l'utilisateur (voir set_error_handler ()), elle deviendra un E_ERROR et le script se terminera.
E_DEPRECATED Notification d'exécution. Lorsqu'il est activé, un avertissement sera émis concernant le code qui pourrait ne pas fonctionner correctement dans les versions futures.
E_USER_DEPRECATED Message d'avertissement en cas de faible sortie utilisateur. Similaire à E_DEPRECATED, mais est généré par l'utilisateur à l'aide de la fonction PHP trigger_error() dans le code.
E_ALL Message d'avertissement en cas de faible sortie utilisateur. Similaire à E_DEPRECATED, mais est généré par l'utilisateur à l'aide de la fonction PHP trigger_error() dans le code.

Gestion des exceptions Laravel

La gestion des exceptions de laravel est complétée par la classe 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');
        }
    }
}

Conversion des exceptions

La gestion des exceptions de laravel est entièrement gérée par la fonction handleException.

PHP7 implémente une interface globale jetable. L'exception d'origine et certaines erreurs implémentent cette interface et définissent la structure d'héritage des exceptions sous forme d'interfaces. En conséquence, davantage d'erreurs dans PHP7 deviennent des exceptions capturables et sont renvoyées aux développeurs. Si elles ne sont pas détectées, ce sont des erreurs. Si elles sont détectées, elles deviennent des exceptions qui peuvent être gérées dans le programme. Ces erreurs captables sont généralement des erreurs qui ne causent pas de dommages mortels au programme, comme une fonction qui n'existe pas.

En PHP7, basées sur l'exception /Error, 5 nouvelles exceptions moteur sont dérivées : ArithmeticError / AssertionError / DivisionByZeroError / ParseError / TypeError. En PHP7, l'ancien /Exception et le nouveau /Error implémentent une interface commune : /Throwable.

Par conséquent, lorsque vous rencontrez une exception de type non-Exception, vous devez d'abord la convertir en un type FatalThrowableError :

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 est une classe d'exception d'erreur dont Symfony hérite de ErrorException :

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

Quand un une exception est rencontrée À ce stade, la première chose que fait Laravel est d'enregistrer le journal. C'est le rôle de la fonction de rapport.

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

La classe de gestion des exceptions par défaut de laravel dans le conteneur Ioc est 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;
        }));
    }
}

Affichage de la page d'exception

Après l'enregistrement du journal, l'exception doit être convertie en page pour afficher les informations d'exception au développeur afin que la source du problème peut être consulté :

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 a une gestion différente pour différentes exceptions, notamment HttpException, HttpResponseException, AuthorizationException, ModelNotFoundException, AuthenticationException et ValidationException. Étant donné que les exceptions spécifiques ont des exigences différentes, elles ne seront pas présentées dans cet article. Cet article continue de présenter la gestion de l'exception HttpException la plus courante :

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);
    }
}

Pour HttpException, différents modèles de page d'erreur seront sélectionnés en fonction de son code d'état d'erreur. S'il n'y a pas de modèle pertinent, la page d'affichage de l'exception sera construite via SymfonyResponse. :

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);
}

【Recommandation associée :tutoriel vidéo 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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:qu'est-ce que Laravel ForgeArticle suivant:qu'est-ce que Laravel Forge