>PHP 프레임워크 >Laravel >laravel의 예외는 무엇입니까

laravel의 예외는 무엇입니까

青灯夜游
青灯夜游원래의
2022-06-28 17:53:332774검색

laravel의 예외에는 다음이 포함됩니다. 1. 복구할 수 없는 "E_ERROR" 치명적인 런타임 오류로 인해 스크립트가 종료되고 계속 실행되지 않습니다. 2. "E_WARNING" 런타임 경고 "치명적이지 않은 오류"; 컴파일 구문 분석 오류 4. 초기화 및 시작 중에 발생하는 "E_CORE_ERROR" 치명적인 오류 5. "E_COMPILE_ERROR" 치명적인 컴파일 시간 오류 6. 캡처할 수 있는 "E_RECOVERABLE_ERROR" 치명적인 오류.

laravel의 예외는 무엇입니까

이 튜토리얼의 운영 환경: Windows 7 시스템, Laravel 9 버전, DELL G3 컴퓨터.

laravel의 예외 수준

Constant Description
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()를 사용하여 사용자가 생성합니다.

Laravel 예외 처리

laravel의 예외 처리는 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');
        }
    }
}

Exception Conversion

laravel의 예외 처리는 모두 handlerException 함수에 의해 처리됩니다.

PHP7은 전역 발생 가능 인터페이스를 구현합니다. 원래 예외와 일부 오류는 이 인터페이스를 구현하고 인터페이스 형식으로 예외의 상속 구조를 정의합니다. 결과적으로 PHP7에서는 더 많은 오류가 포착 가능한 예외가 되어 개발자에게 반환됩니다. 포착되지 않으면 오류가 되어 프로그램 내에서 처리할 수 있습니다. 이러한 포착 가능한 오류는 일반적으로 존재하지 않는 함수와 같이 프로그램에 치명적인 해를 끼치지 않는 오류입니다.

PHP7에서는 /Error 예외를 기반으로 5개의 새로운 엔진 예외가 파생됩니다: ArithmeticError / AssertionError / DivisionByZeroError / ParseError / TypeError. PHP7에서는 이전 /Exception과 새 /Error 모두 공통 인터페이스인 /Throwable을 구현합니다.

따라서 Exception이 아닌 유형의 예외가 발생하면 먼저 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는 Symfony가 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

예외가 발생했을 때 라라벨이 가장 먼저 하는 일은 로그를 기록하는 것입니다. 이것이 리포트 기능의 역할입니다.

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

laravel의 Ioc 컨테이너에 있는 기본 예외 처리 클래스는 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;
        }));
    }
}

예외 페이지 표시

로그를 기록한 후 예외 정보를 개발자에게 표시하기 위해 예외를 페이지로 변환해야 소스가

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은 HttpException, HttpResponseException, AuthorizationException, ModelNotFoundException, AuthenticationException 및 ValidationException을 포함하여 다양한 예외를 다르게 처리합니다. 특정 예외에는 각기 다른 요구 사항이 있으므로 이 문서에서는 이에 대해 구체적으로 소개하지 않습니다. 이 기사에서는 계속해서 가장 일반적인 예외인 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);
    }
}

HttpException의 경우 해당 오류 상태 코드에 따라 다른 오류 페이지 템플릿이 선택됩니다. 관련 템플릿이 없으면 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);
}

【관련 추천:laravel 비디오 튜토리얼

위 내용은 laravel의 예외는 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.