php提供了对异常和错误的处理机制,通过这些机制可以让程序更加健壮;
php中的错误处理机制:
1:常见的错误类型
E_WARNING 警告,非致命的错误。不暂停脚本执行。
E_NOTICE 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
E_ERROR 致命的错误,会导致程序终止执行
E_USER_ERROR 致命的用户生成的错误。类似于使用 PHP 函数 trigger_error() 设置的 E_ERROR。
E_USER_WARNING 非致命的用户生成的警告。类似于使用 PHP 函数 trigger_error() 设置的 E_WARNING。
E_USER_NOTICE 用户生成的通知。类似于使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。
E_ALL 所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)
2:错误处理方式
通过php函数:
1:die()函数:
支持输出一段提示信息,终止程序的运行:
die("程序出现错误");
2:exit()函数:
同die()函数,可以在输出一段提示信息之后终止程序的执行;
exit("程序出现错误");
3:自定义错误处理器:
如果觉得系统对于错误的处理满足不了自己的需求,那么可以自定义错误处理器:
指定错误处理函数:
//自定义错误处理器,通过set_error_handler()函数指定错误处理函数;
set_error_handler(myErrorHandler);
自定义错误处理函数:
myErrorHandler(error_level,error_message,error_file,error_line,error_context)
//特别注意:前两个是必须要有的参数,之后的参数则是可选的;
error_level //必需。为用户定义的错误规定错误报告级别。必须是一个数字。
error_message //必需。为用户定义的错误规定错误消息。
error_file //可选。规定错误发生的文件名。
error_line //可选。规定错误发生的行号。
error_context //可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
4:调整错误的显示和记录:
php同样支持队错误信息的显示与否的设置,以及错误信息的记录设置;
1:设置是否显示错误提示信息:
1:通过display_errors:设置是否输出错误信息:
ini_set("display_errors",0/1/on/off): //0不显示,1显示;
2:在php.ini的配置文件里面设置display_errors = on/off:选择是否输出错误信息;
注:
1:第一种方式设置后只会在当前脚本文件起作用;
2:第二种方式设置后会在全局有效;
3:一般推荐在开发过程中打开错误提示,在正式部署上线只后就关闭这个功能;
2:输出错误报告级别:
1:通过error_reporting:设置错误报告级别
如:
ini_set("error_reporting",E_ALL&~E_NOTICE)
2:在php.ini的配置文件中设置error_reporting的常量值;
注:
1:第一种方式设置后只会在当前脚本文件起作用;
2:第二种方式设置后会在全局有效;
3:常量值由上述错误常量和逻辑表达式组成;
3:设置是否记录错误日志
1:通过log_errors设置是否将错误信息记录到日志中;
如:
ini_set("log_errors",0/1);
2:在php.ini的配置文件里,设置log_errors的值;
注:
1:第一种方式设置后只会在当前脚本文件起作用;
2:第二种方式设置后会在全局有效;
4:错误信息记录位置:
1:通过error_log设置记录错误信息的位置:
如:
ini_set("error_log","log/mylog.log");
2:在php.ini的配置文件里,设置error_log的值;
注:
1:第一种方式设置后只会在当前脚本文件起作用;
2:第二种方式设置后会在全局有效;
3:记录位置可以是自定义的位置,也可以是记录到系统日志:syslog;
4:trigger_error()函数的用法:
ok,谁编写程序肯定都不希望自己的程序动不动出错对吧?,但是你管得了自己还能管得了别人吗?
对,说的就是用这个软件的人,在用户输入错误的时候,无论是故意挑衅还是无意为之,我们都必须要能够进行提示;这时候就需要trigger_error();函数;
trigger_error()函数的作用就在于可以人为的触发用户级别的错误;
这个函数要求有两个参数,
第一个参数是提示信息;是必须的参数;
第二个参数是错误级别:是可选的参数,默认是notice级别;
php中的异常的处理机制:
程序运行过程中除过错误以外还有可能发生异常;看下php对异常的处理:
1:抛出异常:
在有可能出现异常的地方通过throw关键字即可抛出异常:
如:
function splitefunction(){
$i = 0;
if($i == 0){
//在此处直接抛出异常,如果外面能够捕获该异常将能够处理这次异常;
throw new Exception("error msg");
}
}
splitefunction();
2:通过try catch来处理异常
像上面那样,如果外部能够捕获并处理异常最好,但是如果不能的话那程序将会终止执行;
有些时候也需要进行个性化的处理,那么就需要主动捕获异常并处理:
如:
function splitefunction(){
$i = 0;
if($i == 0){
//在此处直接抛出异常,如果外面能够捕获该异常将能够处理这次异常;
throw new Exception("error msg");
}
}
//在这里通过try catch捕获异常并处理
try{
splitefunction();
}catch(Exception $e){
echo $e->getMessage();
}
3:多级异常处理:
多级处理是通过多个catch块进行的:
比如:
function splitefunction(){
$i = 0;
if($i == 0){
//在此处直接抛出异常,如果外面能够捕获该异常将能够处理这次异常;
//此处假设抛出exception1的异常;
throw new Exception1("error msg");
}
}
//在这里通过try catch捕获异常并处理
try{
splitefunction();
}catch(Exception1 $e){
echo $e->getMessage();
}catch(Exception $e){
echo $e->getMessage();
}
通过多个catch块可以捕获多级异常信息,但是要求从上至下异常的级别应该由小到大;
获取异常信息
$e->getMessage():获取异常信息;
$e->getFile():返回发生异常的文件名;
$e->getLine():返回发生异常的代码行号
$e->getTrace():返回错误栈;
自定义异常处理器:
自定义异常处理函数:
function myException($exception)
{
echo "Exception: " . $exception->getMessage();
}
自定义异常处理器:
set_exception_handler('myException');
定义了异常处理器之后,在脚本中的异常将会交由自定义的异常处理函数解决;