前言:
异常是程序运行中不符合预期的情况,以及与正常流程不同的情况。属于逻辑和业务中断的情况,不属于语法错误。但是,异常不处理,在php中会议错误的形式出现,so,我们一起来看看PHP中是怎么处理异常的。
内容概要:
1、异常基本处理:try,throw和catch
2、异常基本处理的总结
一、异常基本处理:try,throw和catch
在PHP中,我们可以使用try,throw和catch的方式对异常进行抛出和捕获。
我们先看不处理的情况:
$a = 'PHP在路上';
echo 4/$a;
运行结果显示:
Warning: Division by zero in /Users/haodaquan/Sites/Test/exception/index.php on line 19
这个实验其实是试图利用除零的方式抛出一个异常,结果,在没有处理的情况下,PHP直接返回了错误的提示。
而对于除零问题,JAVA的处理方式就比较方便,它的内置类会直接获取这个异常情况。
继续,我们试着利用try threw抛出异常,并使用catch方式捕获进行处理:
$a = 'PHP在路上';
try {
if ($a === 0) {
throw new ZeroException("Error Processing Request1", 1);
}else
{
throw new MyException("Error Processing Request2", 1);
}
echo 4/$a;
} catch(MyException $e) {
echo $e->getMessage();
}
运行结果:
Error Processing Request
可以看出,这次我们成功捕获了异常,并对异常进行打印处理。但是,但是,但是,如果我们不在try模块中抛出异常的话,我们是无法捕获异常的。(这不是if else处理方式吗?)。
exception是一个PHP内置的异常处理类,下一节我们详细讨论,这里只需要知道他能捕获错误就行了。
继续,我们看抛出多个异常的写法:
$a = 'PHP在路上';
try {
if ($a === 0) {
throw new ZeroException("Error Processing Request1", 1);
}else
{
throw new MyException("Error Processing Request2", 1);
}
echo 4/$a;
} catch (ZeroException $e) {
echo $e->getMessage();
}
catch(MyException $e) {
echo $e->getMessage();
}
class ZeroException extends Exception
{
public function errorMessage()
{
//error message
return 'Zero:'.$this->getMessage();
}
}
class MyException extends Exception
{
public function errorMessage()
{
//error message
return 'MyMessage:'.$this->getMessage();
}
}
运行结果:
Error Processing Request2
到这里可以看出,PHP的异常处理,越来越像if else了(以后我们会纠正这个观点)。我们可以看出,PHP异常处理每手工抛出一个异常,就要有一个而且至少一个异常处理类相对应(当然,可以直接使用exception类),这句话的意思是:我们可以使用exception类来抛出和捕获所有的异常,不过这样,处理异常就显得有点麻烦了。
二、异常基本处理的总结
我们今天通过例子,了解PHP处理异常的基本方法:try,throw和catch,由此,我们得出以下结论,请大家探讨。
1、PHP的异常是必须手工抛出的,否则就是错误。
2、每个 throw 必须对应一个 catch,即有异常抛出,就必须捕获。
3、PHP异常处理机制是不完善的(相比较JAVA),处理异常比较繁琐。