PHP7中的新机制捕获错误E_PARSE和E_ERROR

发布时间:2019-06-12 23:04:21 来源:PHP官方 作者:青锋建站
  PHP7改变了大多数错误的报告方式。不同于传统(PHP5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。 您可以通过捕获(Throwable)捕获异常和错误。Throwable在PHP5.x上不起作用。要捕获PHP5.x和7中的异常和错误,请先为捕获Throwable后的异常添加捕获块。一旦不再需要PHP5.x支持,就可以删除块捕获异常。以下是青锋建站给大家分享的PHP7中捕获错误E_PARSE和E_ERROR的新机制。

PHP5与PHP7错误处理比较

  过去,在PHP5.x中处理致命错误几乎是不可能的。致命错误不会调用SET_ERROR_HANDER()设置的错误处理程序,只会停止脚本执行。在PHP 7中,当发生致命和可恢复的错误(E_ERROR和E_Recovery_ERROR)时,将引发异常,而不是停止脚本的执行。某些情况下仍然存在致命错误,例如内存不足,并且仍然会像以前一样立即停止脚本执行。在PHP 7中,一个未察觉的异常也将继续是一个致命的错误。这意味着,如果从PHP5.x中的致命错误抛出的异常不存在,那么它仍然是PHP 7中的致命错误。
  从致命错误和可恢复错误引发的异常不会扩展异常。这种分离是为了防止现有的PHP5.x代码捕获用于停止脚本执行的错误引发的异常。从致命和可恢复错误引发的异常是新的和单独的异常类的实例:Error。与任何其他异常一样,错误可能会被捕获和处理,并允许执行任何最终块。

Zend引擎工作机制分析

1、php 在解释运行用户代码时,会以主脚本为载入点,Zend Engine 首先对其进行语法解析(Parse),这里一定要理解,Zend Engine 此时是对脚本的语法进行解析,脚本中的任何 ini 设置都对其无效(还没解释载入执行初始化),所以你设置的什么 error_reporting, display_errors, set_error_handler。只有当语法解析无误,Zend Engine 开始载入并解释脚本,脚本里的一些参数设置项才会开始生效。
2、php 没有 //链接依赖库 -- 编译 -- 运行// 一说。当 php 在主脚本中 “引入依赖” 时,Zend Engine 并不会在对主脚本做语法解析时将其 “依赖” 也载入解析。Zend Engine 只会对当前的主脚本做语法解析,在解析通过后,便开始解释执行用户代码,即便 “依赖” 中有 Parse Error,那也得等到真的执行到载入命令时才会加载解析-解释-运行。
  结论:error_reporting, display_errors, set_error_handler对当前脚本无效,对加载进来的脚本生效;为了正确使用PHP7中的捕获错误的机制,需要将大部脚本代码放入其他文件进行引入,而在主脚本中定义捕获机制来完成对E_PARSE和E_ERROR错误的捕获。

PHP7捕获异常和错误

  这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。
  Error 类并非继承自 Exception 类,所以不能用 catch (Exception $e) { ... } 来捕获 Error。你可以用 catch (Error $e) { ... },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。
try
{
   // Code that may throw an Exception or Error.
}
catch (Throwable $t)
{
   // Executed only in PHP 7, will not match in PHP 5
}
catch (Exception $e)
{
   // Executed only in PHP 5, will not be reached in PHP 7
}

PHP5错误处理机制

  PHP5我们一般通过set_error_handler自定义错误处理函数来进行错误处理。
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
设置用户的函数 (error_handler) 来处理脚本中出现的错误。
  本函数可以用你自己定义的方式来处理运行中的错误, 例如,在应用程序中严重错误发生时,或者在特定条件下触发了一个错误(使用 trigger_error()),你需要对数据/文件做清理回收。
  重要的是要记住 error_types 里指定的错误类型都会绕过 PHP 标准错误处理程序, 除非回调函数返回了 FALSE。 error_reporting() 设置将不会起到作用而你的错误处理函数继续会被调用 —— 不过你仍然可以获取 error_reporting 的当前值,并做适当处理。 需要特别注意的是带 @ error-control operator 前缀的语句发生错误时,这个值会是 0。
  同时注意,在需要时你有责任使用 die()。 如果错误处理程序返回了,脚本将会继续执行发生错误的后一行。
  以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用    set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
  如果错误发生在脚本执行之前(比如文件上传时),将不会 调用自定义的错误处理程序因为它尚未在那时注册。
  以上就是青锋建站给大家分享的PHP7中捕获错误的新错误处理机制工作过程。青锋建站,提供专业的高品质网站制作服务,包括PHP网站建设,SEO,网络营销,PHP软件开发,专业做优化型网站,为企业构建营销平台。
分享到:

Copyright © 2016-2026 青锋建站 版权所有