PHP裡的異常:是屬於邏輯和商務程序的一種中斷,PHP裡的錯誤:自身問題,非法文法或者環境問題,編譯器無法通過檢查,無法運行,本文主要和大家分享PHP異常處理和錯誤處理方法,希望能協助到大家。
如何使用異常處理機制
除零異常在php和java裡實現的區別
<?php/** * Created by PhpStorm. * User: wangkai * Date: 2018/3/6 * Time: 上午8:53 */$a=null;try{ $a=5/0; echo $a;}catch (exception $e){ $e->getMessage(); $a=-1;}echo $a;
運行結果
java實現
public class ExcepetionTry{ public static void tp() throws ArithmeticException{ int a; a=5/0; system.out.println("運算結果:"+a); } public static void main(String[] args){ int a; try{ a=5/0; System.out.println("運算結果"+a); }catch(ArithmeticException e){ e.printStackTrace(); }finally{ a=-1; System.out.println("運算結果"+a); } try{ ExceptionTry.tp(); }catch(Exception e){ System.out.println("異常被捕獲"); } } }}
在PHP裡,認為這是一個錯誤,直接觸發錯誤,不會自動拋出異常,php只有主動throw後,才能捕獲異常
在java裡,認為除零屬於ArithmeticException,會對其進行捕獲,並對異常進行處理
簡單點說,就是php把所有不正常的情況被視做了錯誤,使用if else捕獲異常,php的內建異常類有pdoexception,reflection exception
java裡異常是唯一的錯誤報表方式
php的異常應該怎麼用
1 對程式的悲觀預測
例如高並發條件下的死結問題,悲觀的拋出問題
2 程式的需求和對業務的關注
上傳檔案和儲存到資料庫,保證業務資料的一致性
兩種異常捕獲方式
第一種異常發生時就立即捕獲
<?php try{//可能出錯的程式碼片段if(檔案上傳不成功)throw(上傳異常)if(插入資料庫不成功)throw(資料庫操作異常)}catch(異常){必須的補救措施,如刪除檔案,刪除資料庫插入記錄}}
第二種是分散拋異常集中捕獲
<?php上傳{if(檔案上傳不成功)throw (上傳異常)if(插入資料不成功)throw (資料庫操作異常)//其他代碼try{上傳,其他;}catch(上傳異常){必須的補救措施,刪除檔案,刪除資料插入記錄}catch(其他異常){記錄log}
3 語言層級的健壯性
1.6.2 怎樣看PHP的異常
PHP的異常機制是不足的,php需要關注發生了哪些異常,java則關注異常的捕獲和隨後的補救
最好的辦法就是結合php中的錯誤處理主動拋出異常
1.6.3 PHP中的錯誤層級
php錯誤:會使指令碼運行不正常的情況
錯誤以下幾類:
deprecated最低層級的錯誤,不推薦,不建議,過時的函數或文法造成的
notice 文法中存在不當的地方 使用變數但是未定義,資料索引是字元沒有加引號,php會視其為一個常量,查常量表
找不到,再視為變狼
warning是層級比較高的錯誤,文法中出現不恰當的情況,比如函數參數不匹配,這種錯誤得得到預期結果
fetal error 致命錯誤,直接導致php流程終結,後面代碼不執行
prase error 文法解析錯誤,屬於語法檢查的階段的錯誤
開啟錯誤顯示,php.ini檔案設定
error_reporting=E_ALL|E_STRICT
display_errors=On
在代碼品質或者環境不可控時,使用error_reporting(0)或者函數前面加@
1.6.4 PHP中的錯誤處理機制
php裡有一套錯誤處理機制,可以使用set_error_handler接管PHP錯誤處理
set_error_handler(error_function,error_types)
error_function 規定發生錯誤時啟動並執行函數,必須
error_types 規定在哪個錯誤報表層級會顯示使用者定義的錯誤,可選
<?php/** * Created by PhpStorm. * User: wangkai * Date: 2018/3/6 * Time: 上午10:03 */ // 使用者定義的錯誤處理函數 function myErrorHandler($errno, $errstr, $errfile, $errline) { echo "<b>Custom error:</b> [$errno] $errstr<br>"; echo " Error on line $errline in $errfile<br>"; } // 設定使用者定義的錯誤處理函數 set_error_handler("myErrorHandler"); $a=array('o'=>2,4,5,6); echo $a[o]; ?>
主動拋出異常實現
function customError($errno,$errstr,$errfile,$errline){throw new Exception($level.$errstr);}set_error_handler("customeError");try{$a=5/0;}catch(Exception $e){echo "錯誤資訊:".$e->getMessage();}