laravel中的异常有:1、“e_error”致命运行时错误,不可恢复,会导致脚本终止不再继续运行;2、“e_warning”运行时警告“非致命错误”;3、“e_parse”编译时语法解析错误;4、“e_core_error”初始化启动过程中发生的致命错误;5、“e_compile_error”致命编译时错误;6、“e_recoverable_error”可被捕捉的致命错误。
本教程操作环境:windows7系统、laravel9版,dell g3电脑。
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 () 来产生的。
laravel 异常处理
laravel 的异常处理由类 \illuminate\foundation\bootstrap\handleexceptions::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'); } }}
异常转化
laravel 的异常处理均由函数 handleexception 负责。
php7 实现了一个全局的 throwable 接口,原来的 exception 和部分 error 都实现了这个接口, 以接口的方式定义了异常的继承结构。于是,php7 中更多的 error 变为可捕获的 exception 返回给开发者,如果不进行捕获则为 error ,如果捕获就变为一个可在程序内处理的 exception。这些可被捕获的 error 通常都是不会对程序造成致命伤害的 error,例如函数不存在。
php7 中,基于 /error exception,派生了 5 个新的 engine exception:arithmeticerror / assertionerror / divisionbyzeroerror / parseerror / typeerror。在 php7 里,无论是老的 /exception 还是新的 /error ,它们都实现了一个共同的 interface: /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()); }}
异常 log
当遇到异常情况的时候,laravel 首要做的事情就是记录 log,这个就是 report 函数的作用。
protected function getexceptionhandler(){ return $this->app->make(exceptionhandler::class);}
laravel 在 ioc 容器中默认的异常处理类是 illuminate\foundation\exceptions\handler:
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; })); }}
异常页面展示
记录 log 后,就要将异常转化为页面向开发者展示异常的信息,以便查看问题的来源:
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中有哪些异常的详细内容。