六、异常处理
6.1 抛出异常
从php5开始支持异常处理,异常通过throw抛出,异常抛出后,后面的代码将中断执行
抛出异常会中断程序执行,为什么还要使用异常处理?
异常抛出被用于遇到未知错误,或不符合预先设定条件时,通知客户程序,以便进行其他相关处理,不至于使程序报错中断。
代码中使用了try catch时候,抛出的异常会在catch中捕获,否则会直接中断。
1、基本语法
try{
//可能出现错误或异常的代码
//catch表示捕获,E相册旁听是php内部定义好的异常类
}catch(Wxception $e){
//对异常处理方法:
//1、自己处理
//2、不处理,将其再次抛出
}
2、处理程序:
try:使用异常的函数应该位于try代码内,如没触发异常则代码照常执行,如果异常触发,会抛出一个异常。
Throw:这里规定如何触发异常,每一个throw必须对应至少一个catch
catch:catch代码块会捕获异常,并创建一个包含异常信息的对象。
//创建可抛出一个异常的函数
function checkNum($number){
if($number>1){
throw new Exception("异常提示-数字必须小于等于1");
}
return true;
}
//在 "try" 代码块中触发异常
try{
checkNum(2);
//如果异常被抛出,那么下面一行代码将不会被输出
echo '如果能看到这个提示,说明你的数字小于等于1';
}catch(Exception $e){
//捕获异常
echo '捕获异常: ' .$e->getMessage();
}
通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息
6.2 异常处理类
php具有许多异常处理类其中E相册旁听是所有异常处理的基类。
Exception具有几个基本属性与方法:
message:异常消息内容
code:异常代码
file:抛出异常的文件
line:抛出异常在该文件中的行数
其中的方法有:
getTrace:获取异常追踪信息
getTraceAsString:获取异常追踪信息的字符串
getMessage:获取出错信息
可以通过继承Exception类来创建自定义的异常处理类
//自定义的异常处理类,机场异常基类Exception
class MyException extends Exception{
function getInfo(){
return '自定义错误信息';
}
}
try{
//触发异常
throw new MyException('error');
}catch(Exception $e){
echo $e->getInfo();//获取自定义的异常信息
echo $e->getMessage();//获取继承基类的getMessage信息
}
6.3 异常信息捕获
通过try catch来捕获异常,将执行代码放到try块中,一旦其中代码抛出异常,就能在catch中捕获。
在实际应用中,不会轻易抛出异常,只有在极端情况或者非常重要的情况下才回抛出异常,抛出异常可以保障程序的正确性与安全,避免导致不可预知的bug。
一般异常处理流程:
try{
throw new Exception('wrong');
}catch(Exception $ex){
echo 'Error:'.$ex->getMessage().'<br>';
echo $ex->getTraceAsString().'<br>';
}
echo '异常处理后继续执行的代码';
6.4 获取错误发生的所在行
在异常信息捕获后,我们可以通过异常处理对象获取其中的异常信息,以及获取基本的错误信息。
在实际应用中,通常或获取足够多的异常信息,然后写入到错误日志中。
通过文件名、行号、错误信息、异常追踪信息等记录到日志中,以便以调试与修复问题。
try {
throw new Exception('wrong');
} catch(Exception $ex)
{
$msg = 'Error:'.$ex->getMessage()."\n";
$msg.= $ex->getTraceAsString()."\n";
$msg.= '异常行号:'.$ex->getLine()."\n";
$msg.= '所在文件:'.$ex->getFile()."\n";
//将异常信息记录到日志中 PHP异常处理之
file_put_contents('error.log', $msg);
}