PHP异常处理(Exception)
异常(Exception)处理用于在指定的错误发生时改变脚本的正常流程,是在 PHP5 中的增加的一个重要特性。异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。异常处理的加入使得在 PHP 程序中排查错误、捕获异常更加简单容易,也使得 PHP 程序在健壮性方面有很大改善和提高。异常处理在 PHP 中的具体体现就是,PHP 提供了一个名叫 Exception 的类完成对 PHP 程序异常的处理,这个类包含了一些处理异常的函数,这些函数可以捕获程序异常和错误。
PHP 中的异常处理类
PHP 中提供了内置的异常处理类——Exception,该类中常用的成员函数如下所示:
getMessage():返回异常的消息内容;
getCode():以数字形式返回异常代码;
getFile():返回发生异常的文件名;
getLine():返回发生错误的代码行号;
getTrace():返回 backtrace() 数组;
getTraceAsString():返回已格式化成字符串的、由函数 getTrace() 函数所产生的信息;
__toString():产生异常的字符串信息,它可以重载。注意,该函数最前部是两个下划线。
当一个异常被抛出时,其后的代码不会再继续执行,而 PHP 就会尝试继续查找下一个能与之匹配的 catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,将会产生一个严重的错误,并且输出 UncaughtException...(未捕获异常)的提示信息。
【示例】使用 try catch 和 throw 捕获程序中的异常。
<?php
try{
$err = '抛出异常信息,并跳出 try 语句块';
if(is_dir('./test')){
echo '这里是一些可能会发生异常的代码';
}else{
throw new Exception($err, 12345); // 抛出异常
}
echo '上面抛出异常的话,这行代码将不会执行,转而执行 catch 中的代码。<br>';
}catch(Exception $e){
echo '捕获异常:'.$e->getMessage().'<br>错误代码:'.$e->getCode().'<br>';
}
echo '继续执行 try catch 语句之外的代码';
?>
运行结果如下:
捕获异常:抛出异常信息,并跳出 try 语句块
错误代码:12345
继续执行 try catch 语句之外的代码
PHP 创建自己的异常类
在各种语言里,对异常和错误的定义不同。在 PHP 里遇到任何错误都会抛出一个错误,很少会主动抛出异常,不像 Java 语言那样会预先定义好各种异常类,当程序执行到异常处的代码时会主动抛出。
PHP 的异常处理机制并不完善,在 PHP 中想处理不可预料的异常是办不到的,必须事先定义一些异常,将各种可能出现的异常进行 if…else 判断,手动抛出异常,所以在 PHP 里经常会使用到我们自己创建的异常类。
下面定义两个异常类,都继承自 Exception 基类。
class emailException extends Exception{
function __toString(){
return "<b>email is null</b>file:".$this->getFile().',line:'. $this->getLine();
}
}
class nameException extends Exception{
}
__toString() 方法是自动被调用的,是在直接输出对象引用时自动调用的,所以“__toString()”方法一定要有个返回值(return 语句).
在实际业务中可根据不同需求抛出不同异常,业务代码如下:
function reg($reg) {
if (empty($reg['email'])) {
throw new emailException("emaill is null", 1);
}
if(empty($reg['name'])) {
throw new nameException("name is null", 2);
}
}
在执行业务代码时,需要使用 if 语句判断异常会发生的地方,然后手动抛出异常,将不同的异常分发给不同的异常类处理,如下所示:
try{
$reg = array('phone'=>'1888888888');
reg($reg);
} catch(emailException $e) {
echo $e;
} catch(nameException $e) {
echo 'error msg:' .$e->getMessage().'error code:'.$e->getCode();
} finally {
echo ' finally';
}
这段程序根据不同的情况捕获不同的异常,如果第一个 catch 捕获了异常,即使程序中仍然存在其他异常,也会跳过其他的 catch 代码块,但是不管程序中是否出现异常,最终 finally 中的语句都会执行。
执行以上程序的结果为:
email is null file:/Library/WebServer/Documents/book/try.php,line:39 finally
以上就是本文的全部内容,感谢大家支持JScript之家——编程学习者社区!
|