新闻资讯

NEWS CENTER
栏目导航

Laravel Exceptions——异常与错误处理

发布时间:Mar 05, 2019         已有 人浏览

  对于一个优秀的框架来说,正确的异常处理可以防止暴露自身接口给用户,可以提供快速追溯问题的提示给开发人员。本文会详细的介绍

  异常处理(又称为错误处理)功能提供了处理程序运行时出现的错误或异常情况的方法。

  异常处理通常是防止未知错误产生所采取的处理措施。异常处理的好处是你不用再绞尽脑汁去考虑各种错误,这为处理某一类错误提供了一个很有效的方法,使编程效率大大提高。当异常被触发时,通常会发生:

  PHP 5 提供了一种新的面向对象的错误处理方法。可以使用检测(try)、抛出(throw)和捕获(catch)异常。即使用try检测有没有抛出(throw)异常,若有异常抛出(throw),使用catch捕获异常。

  一个 try 至少要有一个与之对应的 catch。定义多个 catch 可以捕获不同的对象。php 会按这些 catch 被定义的顺序执行,直到完成最后一个为止。而在这些 catch 内,又可以抛出新的异常。

  当一个异常被抛出时,其后的代码将不会继续执行,PHP 会尝试查找匹配的catch代码块。如果一个异常没有被捕获,而且又没用使用set_exception_handler()作相应的处理的话,那么PHP将会产生一个严重的错误,并且输出未能捕获异常(Uncaught Exception ... )的提示信息。

  Try - 使用异常的函数应该位于 try 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。

  Throw - 这里规定如何触发异常。每一个 throw 必须对应至少一个 catch

  Catch - catch 代码块会捕获异常,并创建一个包含异常信息的对象

  在我们实际开发中,异常捕捉仅仅靠try {} catch ()是远远不够的。set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数。

  用户可以用自定义的异常处理类来扩展 PHP 内置的异常处理类。以下的代码说明了在内置的异常处理类中,哪些属性和方法在子类中是可访问和可继承的。

  如果使用自定义的类来扩展内置异常处理类,并且要重新定义构造函数的话,建议同时调用parent::__construct()来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载__toString()并自定义输出的样式。

  致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。

  运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。

  在PHP初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由PHP引擎核心产生的。

  PHP初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由PHP引擎核心产生的。

  致命编译时错误。类似E_ERROR, 但是是由Zend脚本引擎产生的。

  编译时警告 (非致命错误)。类似 E_WARNING,但是是由Zend脚本引擎产生的。

  用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。

  用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。

  用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。

  启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。

  可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler()),将成为一个 E_ERROR从而脚本会终止运行。

  用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。

  用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。

  除了系统在运行 php 代码抛出的意外错误。我们还可以利用rigger_error产生一个自定义的用户级别的error/warning/notice错误信息:

  register_shutdown_function()函数可实现当程序执行完成后执行的函数,其功能为可实现程序执行完成的后续操作。程序在运行的时候可能存在执行超时,或强制关闭等情况,但这种情况下默认的提示是非常不友好的,如果使用register_shutdown_function()函数捕获异常,就能提供更加友好的错误展示方式,同时可以实现一些功能的后续操作,如执行完成后的临时数据清理,包括临时文件等。

  我们前面说过,set_error_handler能够捕捉的错误类型有限,很多致命错误例如解析错误等都无法捕捉,但是这类致命错误发生时,PHP 会调用register_shutdown_function所注册的函数,如果结合函数error_get_last,就会获取错误发生的信息。

  PHP7实现了一个全局的throwable接口,原来的Exception和部分Error都实现了这个接口, 以接口的方式定义了异常的继承结构。于是,PHP7中更多的Error变为可捕获的Exception返回给开发者,如果不进行捕获则为Error,如果捕获就变为一个可在程序内处理的Exception。这些可被捕获的Error通常都是不会对程序造成致命伤害的Error,例如函数不存在。

  当遇到异常情况的时候,laravel首要做的事情就是记录log,这个就是report函数的作用。

  记录log后,就要将异常转化为页面向开发者展示异常的信息,以便查看问题的来源:

  对于HttpException来说,会根据其错误的状态码,选取不同的错误页面模板,若不存在相关的模板,则会通过SymfonyResponse来构造异常展示页面:

  对于致命错误,例如E_PARSE解析错误,handleShutdown将会启动,并且判断当前脚本结束是否是由于致命错误,如果是致命错误,将会将其转化为FatalErrorException, 交给了handleException作为异常去处理。

  请问可不可以直接顶层存处理异常?D:\phpStudy\,这里面有个render方法,是响应给浏览器的,我想在这里捕获不同种类的异常,分别处理。该怎么判断异常的种类?

Copyright © 2002-2019 幸运蛋蛋开奖结果 版权所有