Rumah >rangka kerja php >Laravel >Apakah pengecualian dalam laravel

Apakah pengecualian dalam laravel

青灯夜游
青灯夜游asal
2022-06-28 17:53:332774semak imbas

Pengecualian dalam laravel termasuk: 1. "E_ERROR" ralat masa jalan yang tidak dapat dipulihkan dan akan menyebabkan skrip ditamatkan dan tidak terus berjalan; . "E_PARSE" ralat penghuraian sintaks masa; 4. Ralat maut "E_CORE_ERROR" yang berlaku semasa pemulaan dan permulaan;

Apakah pengecualian dalam laravel

Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Laravel 9, komputer DELL G3.

Tahap pengecualian dalam laravel

常量 说明
E_ERROR 致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。
E_WARNING 运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。
E_PARSE 编译时语法解析错误。解析错误仅仅由分析器产生。
E_NOTICE 运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。
E_CORE_ERROR 在 PHP 初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由 PHP 引擎核心产生的。
E_CORE_WARNING PHP 初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由 PHP 引擎核心产生的。
E_COMPILE_ERROR 致命编译时错误。类似 E_ERROR, 但是是由 Zend 脚本引擎产生的。
E_COMPILE_WARNING 编译时警告 (非致命错误)。类似 E_WARNING,但是是由 Zend 脚本引擎产生的。
E_USER_ERROR 用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。
E_USER_WARNING 用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。
E_USER_NOTICE 用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。
E_STRICT 启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。
E_RECOVERABLE_ERROR 可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致 PHP 引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler ()),将成为一个 E_ERROR 从而脚本会终止运行。
E_DEPRECATED 运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。
E_USER_DEPRECATED 用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。
E_ALL 用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。

Pengendalian pengecualian Laravel

Pengendalian pengecualian Laravel diselesaikan oleh kelas 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');
        }
    }
}

Penukaran pengecualian >

Pengendalian pengecualian Laravel dikendalikan oleh fungsi handleException.

PHP7 melaksanakan antara muka boleh buang global Pengecualian asal dan beberapa Ralat melaksanakan antara muka ini, dan mentakrifkan struktur warisan pengecualian dalam bentuk antara muka. Akibatnya, lebih banyak Ralat dalam PHP7 menjadi Pengecualian yang boleh ditangkap dan dikembalikan kepada pembangun Jika ia tidak ditangkap, ia adalah Ralat Jika ia ditangkap, ia menjadi Pengecualian yang boleh dikendalikan dalam program. Ralat yang boleh ditangkap ini biasanya Ralat yang tidak menyebabkan kemudaratan maut kepada program, seperti fungsi yang tidak wujud.

Dalam PHP7, berdasarkan pengecualian /Error, 5 pengecualian enjin baharu diperoleh: ArithmeticError / AssertionError / DivisionByZeroError / ParseError / TypeError. Dalam PHP7, sama ada yang lama /Exception atau yang baru /Error, mereka semua melaksanakan antara muka biasa: /Throwable.

Oleh itu, apabila menghadapi pengecualian jenis bukan Pengecualian, anda mesti menukarnya terlebih dahulu menjadi jenis 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 ialah kelas pengecualian ralat yang Symfony warisi daripada 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());
    }
}

Log Pengecualian

Apabila menghadapi situasi tidak normal, perkara pertama yang laravel lakukan ialah merekodkan log Ini ialah peranan fungsi laporan.

protected function getExceptionHandler()
{
    return $this->app->make(ExceptionHandler::class);
}
Kelas pengendalian pengecualian lalai Laravel dalam bekas Ioc ialah 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;
        }));
    }
}

Paparan halaman pengecualian

Selepas merekodkan log, Ia adalah perlu untuk menukar pengecualian kepada halaman untuk memaparkan maklumat pengecualian kepada pembangun untuk menyemak sumber masalah:

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);
    }
}
Untuk pengecualian yang berbeza, laravel mempunyai pemprosesan yang berbeza, kira-kira termasuk HttpException, HttpResponseException, AuthorizationException, ModelNotFoundException , AuthenticationException, ValidationException. Memandangkan pengecualian berbeza tertentu mempunyai keperluan berbeza mereka sendiri, artikel ini tidak akan memperkenalkannya secara khusus. Artikel ini terus memperkenalkan pengendalian pengecualian yang paling biasa HttpException:

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);
    }
}
Untuk HttpException, templat halaman ralat yang berbeza akan dipilih berdasarkan kod status ralatnya Jika tiada templat yang berkaitan, ia akan dipilih lulus SymfonyResponse untuk membina halaman paparan pengecualian:

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);
}
[Cadangan berkaitan:

tutorial video laravel]

Atas ialah kandungan terperinci Apakah pengecualian dalam laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:apa itu laravel forgeArtikel seterusnya:apa itu laravel forge