laravel의 예외에는 다음이 포함됩니다. 1. 복구할 수 없는 "E_ERROR" 치명적인 런타임 오류로 인해 스크립트가 종료되고 계속 실행되지 않습니다. 2. "E_WARNING" 런타임 경고 "치명적이지 않은 오류"; 컴파일 구문 분석 오류 4. 초기화 및 시작 중에 발생하는 "E_CORE_ERROR" 치명적인 오류 5. "E_COMPILE_ERROR" 치명적인 컴파일 시간 오류 6. 캡처할 수 있는 "E_RECOVERABLE_ERROR" 치명적인 오류.
이 튜토리얼의 운영 환경: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!