与异常相关的配置项:
①:错误有两种呈现方式,一种是display_errors=on /off 配置项控制错误是否显示到浏览器中,另一种是log_errors和error_log配置的错误日志里面
②:配置error_reporting设置错误报告级别,这个与display_errors和error_log有关,只会把对应的错误级别记录到错误日志中或者打印到浏览器上
异常处理:
①:try...catch的方式进行异常的捕获,这其中是phper要主动抛出一个异常出来throw new exception();它会被第一个catch给捕获,这里有两点注意,display_errors要开启和错误是主动抛出的(throw);有个驳论就是既然要主动throw出来错误,那么就是能够判断处那边出问题,那么都知道会出错误为什么还要捕获呢?之间写出正确的逻辑不就好了
②:框架中是可以捕获所有的错误和异常的,主要用到register_shutdown_function,set_error_handler,set_exception_handler三个函数
A: set_error_handler()
这个函数用于捕获错误,设置一个用户自定义的错误处理函数,当程序出现错误的时候会自动调用此方法,不过需要注意一下两点,第一:如果存在此方法,相应的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级别的错误。
例子:
<?php set_error_handler('zyferror'); function zyferror($type, $message, $file, $line) { var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />'); } ?>
调用方法多样:
<?php // 直接传函数名 NonClassFunction set_error_handler('function_name'); // 传 class_name && function_name set_error_handler(array('class_name', 'function_name')); ?>
B:register_shutdown_function()
捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误,die(),exit,异常,正常结束都会调用;这个函数很吊,但它只提供了执行的时间,对于是否包含错误需要借助于另一个函数:error_get_last();这个函数可以拿到本次执行中产生的错误。
error_get_last();返回的信息:【type】错误类型 , 【message】错误信息 , 【file】错误发生的文件,【line】错误所在行
例如:
<?php register_shutdown_function('zyfshutdownfunc'); function zyfshutdownfunc() { if ($error = error_get_last()) { var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>'); } } ?>
C:set_exception_handler()
设置默认的异常处理程序,用在没有用try/catch块来捕获的异常,也就是说不管你抛出的异常有没有人捕获,如果没有 人捕获就会进入到该方法中,并且在回调函数调用后异常会中止。
例如:
<?php set_exception_handler('zyfexception'); function zyfexception($exception) { var_dump("<b>set_exception_handler: Exception: " . $exception->getMessage() . '</b>'); } throw new Exception("zyfexception"); ?>
扩展:错误类型和屏蔽方案
三种错误分类:1、注意(notice) 2、警告(warnings)3、致命错误(fatal errors)
错误种类:
E_ERROR:通常会显示出来,也会中断程序执行。
E_WARNING:通常都会显示出来,但不会中断程序的执行。
E_NOTICE:在脚本正常运行下发生的代码错误。
E_PARSE:语法解析错误。
E_CORE_ERROR:在PHP启动时发生的致命错误。
E_CORE_WARNING:报告在PHP启动时发生的非致命性错误。
E_COMPILE_ERROR:编译时发生的致命错误,指出脚本的错误。
E_USER_ERROR:用户产生的错误信息。
E_USER_WARNING:用户产生的警告信息。
E_USER_NOTICE:用户引发的注意消息。
E_STRICT:编码标准化警告,运行时发生的错误。
E_RECOVERABLE_ERROR:接近致命的运行时错误,若未被捕获则视同E_ERROR。
E_ALL:捕获所有的错误和警告。
屏蔽PHP错误提示
方法一:在有可能出错的函数前加@,然后or die("") 如:
@mysql_connect(...) or die("Database Connect Error")
方法二:编辑php.ini ,查找"display_errors =" ,将“=”后面的值改为"off。
方法三:在php脚本前加error_reporting(0),屏蔽所有错误提示。
其中,error_reporting 配置错误信息回报的等级。
语法:int error_reporting(int [level]);
文章借鉴地址:https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html