在PHP中或其他任何语言中,异常和错误的概念都是不一样的。
PHP中遇到非正常代码,通常都会触发错误,而不是抛出异常。
```
<?php
/**
* User: 三千
* Date: 16/4/13
* Time: 上午11:31
*/
$a = null;
try{
$a = 5 / 1;
echo $a,PHP_EOL;
}catch(exception $e){
$e->getMessage();
$a = -1;
}
echo $a;
```
结果:
```
changzuxindeMacBook-Pro% php 1.6.1_1.php
Warning: Division by zero in /Users/changzuxin/www/code/php_core/1.6.1_1.php on line 10
```
可以看到,对于除0这种异常情况,PHP认为这是一个错误,直接触发错误,而不会自动抛出异常使程序进入异常流程,所以如果想使用异常处理不可预料的问题,是办不到的。
PHP中只有你主动throw后,才能捕捉异常。
比如说:
```
<?php
/**
* User: 三千
* Date: 16/4/13
* Time: 上午11:12
*/
class emailException extends Exception{
}
class pwdException extends Exception{
function __toString(){
return "Exception{$this->getCode}:{$this->getMessage()} \n in File:{$this->getFile()} on line :{$this->getLine()}";
}
}
function reg($reginfo = null){
if(empty($reginfo) || !isset($reginfo)){
throw new Exception("参数非法");
}
if(empty($reginfo['email'])){
throw new emailException("邮件为空");
}
if($reginfo['pwd'] != $reginfo['repwd']){
throw new pwdException("两次密码不一致");
}
echo "注册成功";
}
```
上面的代码判断传入的参数,根据业务进行异常分发。如果没有传入任何参数,就把异常分发给exception超类,跳出注册流程,如果email地址不存在,那么把异常分发给自定义的emailException异常,跳出注册流程;如果两次密码不一致,则将异常分发给自定义的pwdException异常,跳出注册流程。
异常分发完之后,在对异常进行分拣并做处理。
```
try{
reg(array('email'=>'','pwd'=>123,'repwd'=>456));
}catch(emailException $e){
echo $e->getMessage();
}catch(pwdException $e){
echo $e;
echo PHP_EOL,'特殊处理';
}catch(Exception $e){
echo $e->getTraceAsString();
echo PHP_EOL,'其他情况,统一处理';
}
```
结果
```
changzuxindeMacBook-Pro% php 1.6.1_2.php
邮件为空%
```
注意,exception作为超类应该放在最后捕获。不然捕获这个异常超类后,后面的捕获就终止了,而这个超类不能提供针对性的信息和处理。
在这里,对表单进行异常处理,通过重写异常类、手动抛出错误的方式进行异常处理。这是一种业务异常,可以认为地把所有不符合要求的情况都试作业务异常,和通常意义上的代码异常相区别。
在PHP中异常该怎么用?在什么时候抛出异常,什么时候捕获?什么场景下能应用异常?在下面三种场景下会用到异常处理机制。
- 对程序的悲观预测
- 程序的需要和对业务的关注
- 语言级别的健壮性要求
1.对程序的悲观预测
是指程序员认为他的代码无法一一处理各种可预见、不可预见的情况,那该程序员就会进行异常处理。假设一个场景,程序员悲观地认为自己的这段代码在高并发条件下产生死锁,那么他就会悲观地抛出异常,然后在死锁时进行捕获,对异常进行细致的处理。
2.程序的需要和对业务的关注
如果程序员希望业务代码中不会充斥
- 空白目录
- 第1章 面向对象思想的核心概念
- 1.1 面向对象的“形”与“本”
- 1.1.1 对象的“形”
- 1.1.2 对象的“本质”
- 1.1.3 对象与数组
- 1.1.4 对象与类
- 1.2 魔术方法的应用
- 1.2.1 construct和destruct方法
- 1.2.2 set和get方法
- 1.2.3 call和callStatic方法
- 1.2.4 __toString方法
- 1.3 继承与多态
- 1.3.1 类的组合与继承
- 1.3.2 各种语言中的多态
- 1.4 面向接口编程
- 1.4.1 接口的作用
- 1.4.2 对接口的思考
- 1.5 反射
- 1.5.1 如何使用反射API
- 1.6 异常和错误处理
- 1.6.1 如何使用异常处理机制
- 1.6.2 怎样看PHP的异常
- 1.6.3 PHP中的错误级别
- 1.6.4 PHP中的错误处理机制
- 1.7 本章小结
- 第2章 面向对象的设计原则
- 2.1 面向对象设计的五大原则
- 2.2 一个面向对象留言本的实例
- 2.3 面向对象的思考
- 2.4 本章小结
- 第3章 正则表达式基础与应用
- 3.1 认识正则表达式
- 3.2 正则表达式中的元字符
- 3.3 正则表达式匹配规则
- 3.4 构造正则表达式
- 3.5 正则在实际开发中的应用
- 3.6 正则表达式的效率与优化
- 3.7 本章小结