在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 本章小結