PHP 异常处理
PHP 中的异常的独特性,即 PHP 中的异常不同于主流语言 C++、java 中的异常。在 Java 中,异常是唯一的错误报告方式,而在 PHP 中却不是这样,而是把所有不正常的情况都视作了错误进行处理。这两种语言对异常和错误的界定存在分歧。什么是异常什么是错误,两种语言的设计者存在不同的观点。
PHP 中的异常:
是程序在运行中出现不符合预期的情况及与正常流程不同的状况。一种不正常的情况,按照正常逻辑本不该出的错误,但仍然会出现的错误,这是属于逻辑和业务流程的错误,而不是编译或者语法上的错误。
PHP 中的错误:
是属于 php 脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。warning、notice 都是错误,只是他们的级别不同而已,并且错误是不能被 try-catch 捕获的。
在 PHP 中遇到任何自身错误都会触发一个错误,而不是抛出异常。PHP 一旦遇到非正常代码,通常都会触发错误,而不是抛出异常。因此,如果想要使用异常处理不可预料的问题,是办不到的。
典型例子
结果显示:
此时出现了一个警告级别的错误,程序终止。
结论:
PHP 通常是无法自动捕获有意义的异常,它把所有不正常的情况都视作了错误,你要想捕获异常就得使用 if....else 结构,保证代码是正常的,然后判断进行手动抛出异常。
2、PHP 中的错误级别
PHP 中的异常机制是不足的,绝大多数情况下无法自动抛出异常,必须使用 if....else 语句先进行判断,在进行手动抛出异常。
手动抛出异常的意义不大,是已经预料到的错误,这种方式将会使你陷入纷繁复杂的业务逻辑判断和处理中。
因此我们可以通过一些特殊的函数来自定义错误处理函数,来接管 PHP 原生的错误处理函数,然后再进行抛出异常。
接下来我们需要了解 PHP 中的一些错误。
错误显示控制:
【ALL 设置】
全局:php.ini 中设置 display_error = on/off;
局部:ini_set("display_error", true/false);
PHP.ini 中 display_errors = Off 失效的解决 问题: PHP 设置文件 php.ini 中明明已经设置 display_errors = Off,但是在运行过程中,网页上还是会出现错误信息。 解决: 经 查 log_errors= On,据官方的说法,当这个 log_errors 设置为 On,那么必须指定 error_log 文件,如果没指定或者指定的文件没有权限写入,那么照样会输 出到正常的输出渠道,那么也就使得 display_errors 这个指定的 Off 失效,错误信息还是打印了出来。于是将 log_errors = Off,问题就解决了。
【选择性设置显示错误】
全局:error_reporting = E_ALL | E_STRICT....
局部:error_reporting(E_ERROR | E_WARNING | E_PARSE)
一共有十五种,使用二进制代替,0000 0000 0000 0011 表示 E_ERROR 和 E_WARNING
例如:
error_reporting(3); //只显示 E_ERROR 和 E_WARNING 错误
error_reporting(-1); //只显示所有错误误
注意:
在开发阶段通常是显示所有错误,方便解决问题;
在生产阶段通常是隐藏错误,并将需错误记录到文件中(错误日志);
php.ini 中设置:log_error = on/off; //记录、不记录
error_log = php_errors.log //设定错误日志文件(此时没有给定路径则在当前位置生成)
还可以通过 ini_set()进行设置。
3、PHP 中的异常处理
3.1、set_error_handler(error_function, error_type)
使用 set_error_handler(error_function, error_type)函数设置自定义错误处理函数,接管原错误处理函数。
eg.
由结果可知:我们自定义的 myError 方法截取了错误,此时我们可以主动的处理这些错误,抛出相应的异常。
但是我们需要注意以下两点:
第一,如果存在该方法,相应的 error_reporting()就不能在使用了。它将接管 PHP 原生错误处理函数,即所有的错误都会交给自定义的函数处理。
第二,此方法不能处理以下级别的错误:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,set_error_handler() 函数所在文件中产生的 E_STRICT,该函数只能捕获系统产生的一些 Warning、Notice 级别的错误。
注意:
如果在脚本执行前发生错误,由于此时自定义的错误处理函数还没有注册,因此就用不到这个自定义错误处理程序
3.2、register_shutdown_function(exception_function)
捕获 PHP 的错误:Fatal Error、Parse Error 等,这个方法是 PHP 脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用。
通过这个函数就可以在脚本结束前判断这次执行是否有错误产生,这时就要借助于一个函数:error_get_last();这个函数可以拿到本次执行产生的所有错误。error_get_last();返回的信息:
[type] - 错误类型
[message] - 错误消息
[file] - 发生错误所在的文件
[line] - 发生错误所在的行
注意:当 parse-time 出错时是不会调用本函数的。只有在 run-time 出错的时候,才会调用本函数。即需要成功注册此函数才能使用。【测试 3 和测试 4 对比】
eg.
3.3、set_exception_handler(exception_function)
作用:
set_exception_handler() 函数设置用户自定义的异常处理函数。
该函数用于创建运行时期间的用户自己的异常处理方法。
该函数会返回旧的异常处理程序,若失败,则返回 null。
提示:在这个异常处理程序被调用后,脚本会停止执行。
eg.
评论