### 概述
程序運行與預期不太一致,與錯誤是兩個不同的概念 .
### 語法
每一個try都需要對應一個catch或者多個catch代碼塊 ,用來捕獲不同類產生的異常 . 如果try代碼塊沒有找到異常PHP將會跳過catch代碼塊進行下面的程序運行 . 如果有一個異常被拋出的話,throw里面的代碼就不會被執行了 .
~~~
try{
需要進行異常處理的代碼段;
}catch(Exception $e){
...
}catch(Exception $e){
...
}catch(Exception $e){
...
}
~~~
### 經典除零案例
~~~
$num = null;
try{
$num = 3 / 0;
var_dump($num);
} catch(Exception $e){
echo $e->getMessage();
}
echo 'continue...';
~~~
結果
~~~
Warning: Division by zero in C:\Users\Artisan\Desktop\project\Test\index.php on line 5
float(INF)
continue...
~~~
程序并沒有跑到catch段中 . 當我們遇到0當除數的時候,這觸發了PHP中本身的一個錯誤,而沒有走到catch段中, 反而產生了一個警告 .**也就是說PHP首先觸發的是錯誤,而不會自動的拋出異常** . 在PHP中必須手動,主動的通過throw拋出異常才可以 .
### 通過throw拋出異常
~~~
$num1 = 3;
$num2 = 0;
try{
if($num2 == 0){
throw new Exception("0不能當做除數"); //throw之后的代碼不會被執行
echo "這里不會被執行";
}else{
$result = $num1 / $num2;
}
} catch(Exception $e){
echo $e->getMessage(); //之后可以通過die()或者return 來停止程序 .
}
echo 'continue...';
~~~
~~~
0不能當做除數
continue...
~~~
PHP的異常和其他語言不太一樣, 在Java中它認為除0就是異常,它就會捕獲,并進行處理 . PHP的異常機制還不太完善 .
### PHP內置異常類
PHP也內置了一些異常類, 也可以不通過throw的方式去拋出異常 .比PDO異常類 .
~~~
try{
$pdo = new PDO("mysql:host=localhost;dnname=mysql",'root','xxxx');//這里并沒有手動throw
}catch(Exception $e){
echo $e->getMessage();
}
~~~
結果
~~~
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)
~~~
### 錯誤和異常的區別
當遇到錯誤的時候,PHP會主動的觸發錯誤,而不會主動的拋出異常 . 只有他通過throw語句來拋出異常, 然后通過catch來捕獲異常 . 在PHP中錯誤已經很有用了,但是錯誤和異常還是有區別的 . 首先,他們是兩個不同的機制 . 錯誤是沒有辦法在調用的時候向上傳遞的 ,因為錯誤必須馬上進行處理 .而異常會一一向上傳遞,直到我們去捕獲 . 在發生錯誤的時候,我們必須要對我們的錯誤腳本進行處理 ,而異常可以自定義的來處理異常錯誤信息. 如果沒有錯誤消息,我們很難確定程序哪里出現了哪些問題 ,因為我們觸發的任何錯誤都不具有相關的錯誤代碼或者名稱 . 這時候異常的好處就體現出來了,因為異常都是通過代碼來拋出,接著通過代碼向上傳遞,直到我們通過代碼來捕獲異常信息 .
- PHP加密技術
- md5加密
- Crypt加密
- 函數
- 概述
- 強類型參數
- 可變參數列表
- 值傳遞&引用傳遞
- 變量作用域
- 可變函數
- 嵌套函數
- 遞歸函數
- 匿名函數(閉包)
- 面向對象
- 概念
- 類
- 對象的傳值
- 對象的克隆
- 構造方法
- 析構方法
- 克隆方法
- $this
- 類常量
- 靜態屬性
- 靜態方法
- 繼承
- 重寫
- 重載
- 概述
- 屬性重載
- 概述
- __set()
- __get()
- __unset()
- __isset()
- 方法重載
- 概述
- __call()
- __callstatic()
- 封裝
- 最終類
- 抽象類
- 接口
- 對象的序列化與反序列化
- __sleep()
- __wakeup()
- 其他魔術方法
- 對象的遍歷
- 類和對象相關函數
- 錯誤
- 概述
- 設置錯誤級別
- trigger_error()觸發錯誤
- 處理PHP中的錯誤
- 異常
- 概述
- 自定義異常類
- 自定義文件寫入異常類
- 記錄和發送異常信息
- 使用觀察者模式處理異常信息
- 自定義異常處理器
- 設計模式
- 創建型
- 單例模式
- 工廠模式
- 原型模式
- 結構型
- 注冊樹模式
- 適配器模式
- 數據映射模式
- 裝飾器模式
- 代理模式
- 行為型
- 策略模式
- 觀察者模式
- 迭代器模式
- 網絡
- cURL
- Oauth2.0
- QQ第三方登錄
- TCP/IP協議
- 概述
- HTTP協議
- 概述
- HTTP請求協議
- HTTP響應協議
- WebSocket
- 安裝擴展
- Redis
- Socket
- 計算機通信
- socket簡介
- PHP操作socket
- TCP
- HTTP服務端
- WebSocket
- PHP7
- 生成器yield
- 異常finally
- CGI和FPM
- php有用命令
- 內存