16.3.2 PHP程序中捕获异常的方法
在了解了PHP处理异常的类之后,本小节向读者介绍在PHP程序中使用该类捕获异常和处理异常的方法。首先介绍两种抛出异常的格式,它们如下所示。
❑try……catch……:该处理异常方式的具体格式如下所示。
try
{
//这里是可能出现异常或错误的代码,比如文件操作、数据库操作等
}
catch(Exception$e)
{
//输出错误信息
}
❑throw:关键字throw用来抛出一个异常。
需要进行异常处理的代码都必须放入try代码块内,以便捕获可能存在的异常。每一个try至少要有一个与之对应的catch。使用多个catch可以捕获不同的类所产生的异常。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,PHP代码就会在跳转到最后一个catch的后面继续执行。
在PHP代码中所产生的异常可被throw语句抛出并被catch语句捕获。当然,PHP允许在catch代码块内再次抛出(throw)异常。当一个异常被抛出时,其后的代码将不会继续执行,而PHP就会尝试继续查找第一个能与之匹配的catch。如果一个异常没有被捕获,而且又没使用set_exception_handler()作相应的处理的话,那么PHP将会产生一个严重的错误,并且输出UncaughtException……(未捕获异常)的提示信息。代码16-2是try……catch和throw一起用的示例代码,从这个代码可以看出try……catch和throw在程序中是如何工作的。
代码16-2 使用try……catch捕获并处理异常的示例程序16-2.php
01 <?php
02 try
03 {
04 $error='抛出异常信息,并且跳出try块<br/>';
05 if(is_dir('./test'))
06 {
07 echo'检测到../ch16是一个目录';
08 echo'<br/>';
09 echo'可能继续做其他一些操作';
10 echo'<br/>';
11 echo'……';
12 echo'<br/>';
13 }
14 else
15 {
16 throw new Exception($error,12345);//抛出异常
17 }
18 echo'上面throw异常的话,这行代码不会执行,转而执行catch块<br/>';
19 }
20 catch(Exception$e)//获取异常
21 {
22 echo'捕获异常:'.$e->getMessage()."<br/>错误代码:".$e->getCode().'<br/>';
23 //显示serror和123456
24 echo'<br/>';
25 }
26
27 echo'继续执行';
?>
【代码解析】这段代码在try块中试着判断当前目录下是否存在名叫test的目录,如果不存在这个目录,那么就会执行第16行语句,通过关键字throw抛出异常。这个异常是一个Exception类的对象,通过new运算符生成,并且用错误信息$error和错误代码12345初始化该对象,以便后面catch该异常时(代码第20行),可以获取这些信息。一旦抛出异常,那么try块中剩下的代码就不再执行,程序流程转至相应的catch块执行。代码16-2的执行结果如图16-1所示。
这段代码中,自定义了错误信息和错误代码,通过关键字throw抛出一个异常Exception类的对象$e,最终通过该对象调用其成员函数输出错误信息和代码。