- 错误处理及调试 -
Hypertext Preprocessor
一、错误处理概述
1
常见错误类型
1.语法错误
语法错误是指编写的代码不符合PHP的编写规范。语法错误最为常见,也最容易修复。
2.运行错误
运行错误一般不会阻止PHP脚本的运行,但会阻止脚本做希望它做的任何事情。
3.逻辑错误
逻辑错误不但不会阻止PHP脚本运行,还不会显示出错误信息。
4.环境错误
环境错误是由PHP开发环境配置的问题引起的代码报错。
2
错误级别
上述列表的中的E_ERROR、E_NWARNING、E_ALL等错误都是PHP解释器自动触发的。实际上,除了PHP解释器自动触发的错误外,还可以根据不同的要求自觉定义错误,他们可以用于协助调试,在发布给其他人的代码生成不推荐使用的通知等。PHP的内置函数trigger_error()来触发错误,函数的声明如下:
bool trigger_error(string $error_msg [, int $error_type=E_USER_NOTICE])
在使用trigger_error()函数触发错误之前,一定要先使用ini_set()函数让错误显示,否则使用trigger_error()函数无法触发错误。
二、如何处理错误
1
显示错误报告
1.修改配置文件
通过直接配置php.ini文件来实现错误报告,代码如下:
error_reporting(E_ALL & ~E_NOTICE);
display_errors=on;
2.error_reporting()和ini_set()函数
通过PHP语言提供的error_reporting()和ini_set()函数来实现显示错误报告,代码如下:
error_reporting(E_ALL & ~E_NOTICE);
ini_set('display_error',1);
3.die()函数
die()函数可以用来自定义输出错误信息,常用于业务逻辑的错误显示。
2
记录错误日志
1.修改配置文件
通过修改php.ini配置文件,可以直接设置记录错误日志的相关信息,具体代码如下:
error_reporting=E_ALL log_error=On error_log=/tmp/php_errors.log
2.error_log()函数
error_log()函数用于设置显示错误级别,E_ALL表示显示所有的错误,其函数声明如下:
bool error_log (string $message [, int $message_type=0 [, string $destination [, string #extra_headers]]])
上述声明中,$message表示要记录的错误信息。参数$message_type表示消息类型,该参数有两个值0或1,0表示发送到服务器地址,1表示使用mail()函数发送到指定邮件地址,$destination表示错误日志记录的位置,$extra_headers表示额外的头,当$message_type=1时才会使用。
3
自定义错误处理器
自定义错误处理器是通过set_error_handler()函数来实现的,其函数的声明如下:
mixed set_error_handler(callable $error_handler [, int $error_types=E_ALL | E_STRICT])
上述声明中,callable表示该参数$error_handler为回调函数类型。$error_handler是必须定义的参数,表示发生错误是运行的函数。$error_types用于指定处理错误的级别类型。其中,error_handler参数必须符合错误处理器函数的原型,原型如下:
function handler(int $errno, string $errstr [,string $errfile [, int $errline [, array $errcontext]]]);
上述代码中,参数$errno表示错误级别,$errstr表示错误说明,$errfile表示错误代码的文件名称,errline表示错误发生的代码行的行号,$errcontext表示在触发错误的范围内存在的所有变量的数组。其中前两个参数是必填参数。
三、异常处理
1
异常的概述与处理
在PHP5中加入了异常处理机制,它与错误的区别在于:异常定义了程序中遇到的非致命的错误。当程序遇到错误时,需要对异常进行捕获并进行处理。在PHP中可以通过throw关键字来抛出一个异常,如果要捕获和处理异常需要try...catch代码块来完成。
function checkNum($number){
if(Tnumber>1){
//抛出异常
throw new Exception("Balue must be I or below");
}
return true;
}
//可能触发异常的代码
try{
checkNum(2);
}
//抛出异常
catch(Exception $e){
echo 'Message:'.$e->getMessage();
}
2
自定义异常与多个catch模块
自定义异常只需要集成自Exception类,并添加自定义的成员属性和方法。一段脚本中可以使用多个异常,来检测多种情况。
class CustomException extends Exception{
public function errorMessage(){
//定义错误信息的显示格式
$errorMsg='Error on line'.$heis->getLine().'in'.$this->getFlie().':'.$this->getMessage().'is not a valid E-Mall adress';
return $errorMsg;
}
}
try{
//检查邮件地址是否合法
if(fliter_var($email, FILTER_VALIDATE_EMAIL)==FALSE){
//如果不合法抛出异常
throw new CustomException($email);
}
//检查邮件地址是否有字符串“example”
if(strpos($emil, "example")!==FALSE){
//如果存在则抛出异常
throw new Exception("$email is an example e-mail");
}
}
catch(CustomException $e){
//捕获我们自定义的错误类CustomException中抛出的邮件是否合法的异常信息
echo $e->errorMessage();
}
catch(Exception $e){
//捕获默认错误类Exception中抛出的邮件地址中是否有字符串“example”的异常信息
echo $e->getMessage();
}
定义了一个自定义异常类CustomException,在try代码中根据用户输入的地址格式不同,会引发不同的异常,在代码中有两个catch块,分别用来捕获CustomException和Exception异常并处理。设置顶层异常处理器用于没有用try/catch块来捕获的异常,该函数声明如下:
callable set_exception_handler(callable $exception_handler)
该函数只有一个参数$exception_handler表示异常处理函数,该异常处理函数需要在被调用前定义。
四、PHP的调试技术
1
使用输出函数进行调试
1.print()函数用于输出字符串,语法格式如下:
int print(string $arg)
2.echo()函数用于输出一个或多个字符串,语法格式如下:
void echo(string $arg1 [, string $...])
3.print_r()函数用于打印一个变量易于理解的信息,语法格式如下:
bool print_r(mixed $exprission [, bool $return])
4.var_dump()函数用于打印变量的相关信息,语法格式如下:
void var_dump(mixed $expression [, mixed $expression [, $...]])
2
使用文件记录进行调试
file_put_contents()函数可以将程序的相关信息记录到某个文件中。这样程序中出现过的错误或是警告就会保存在文件中,以便以后进行信息的追溯。函数的声明如下:
int file_put_contents(string $filename, mixed $data [, int $flags=0 [, resource $context]])
其中file_put_contents()函数有3个参数,其中第一个参数$filename表示要被写入的文件名,第二个参数$data表示要写入的数据。第三个参数表示附件选项。
3
使用Xdebug进行调试
Xdebug工具是一个开放源代码的PHP程序调试器,用来调试和分析程序的运行状况。
1.首先下载Xdebug相应的版本,将下载好的安装文件php_xdebug-2.2.3-5.3-vc9.dll放到PHP的ext目录中,然后在php.ini文件中添加几行配置信息,具体如下:
[Xdebug]
zend_extension="C:\lamp\php5\ext\php_xdebug-2.2.3-5.3-vc9.dll"
xdebug.remote_enable=true
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
上述信息配置完成后,需要重启Apache服务器使配置文件php.ini生效。
2.Xdebug的使用。首先创建一个出错的程序,该程序包含一个不存在的文件,具体如下:
testXdebug();
function testXdebug(){
reguireFile();
}
function requireFile(){
require_once('abc.php');
}
打开IE浏览器,访问该文件,会发现错误信息变成了彩色,并且定位了出错的函数testXdebug(),因此Xdebug工具可以追踪代码出错的具体位置,并且有迅速定位快速排错的功能。
领取专属 10元无门槛券
私享最新 技术干货