- 了解 PHP 錯誤與例外發生時的處理方式
PHP 處理錯誤與例外發生的方式
- 掌握錯誤與例外
- 避免非預期的結果干擾使用者!
- 強化安全性,避免惡意的使用者查覺系統問題!
- 在預期錯誤發生時,仍可導入正常處理流程!
- 錯誤的情況處理分類
- die 況狀 : 利用 die() 函數處理錯誤情形,將程式導出並且中止執行!
- 客製化錯誤 : 發生錯誤情形時,導入自製的處理程序!
- 錯誤報告 : 將錯誤情形報告出來,寫入檔案或是資料庫!此種報告可協助找出錯誤問題,加以處理!
- 例 : 自行客製化錯誤的方式 myError.php
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
- 錯誤與例外的不同
- 例外是可以抛出與接收處理,但錯誤則是無法恢復!
- 例外可以使用物件導向的方式來掌握與處理!
- 例外的情況處理分類
- 注意(Notice): 不嚴重的問題,程式也不會停止
- 警告(Warning): 程式碼有錯誤,但程式亦不會停止執行
- 致命錯誤 (Fata Error): 遇上嚴重錯誤,程式停止執行
- try…catch 敘述
- 語法
try { 可能會發生錯誤的程式碼; } catch(Exception $e){ 處理例外的程式碼; }
- Exception 是 PHP 處理例外的類別
- 屬性值有兩個,一個是訊息,另一個則是代號值
- 訊息會描述程式產生錯誤的地方
- 代號值為錯誤代碼
- 使用的語法 : 可以自行抛出 Exception
throw new Exception('Error Message', 100);
- 語法
- 抛出例外與接收
- 當程式抛出例外時,程式會自動暫停,接下來的程式碼也不會運作!
- 例 : throwExp.php
<?php function check($num){ if ( $num == 0 ){ throw new Exception('num can not be 0', 100); } return $num; } try{ echo check(0); } catch (Exception $e){ echo "Error Message: ".$e->getMessage()."
"; echo "Error Code: ".$e->getCode()."
"; } ?>
- Exception 類別的繼承
- 利用繼承 Exception 類別,自訂例外處理的屬性與方法!
- 例 : selfExp.php
<?php class EmailFormatException extends Exception { function printMessage(){ echo "例外訊息:" . $this->getMessage() . "
"; } } function checkEmail($email){ if (!strpos($email,"@")) throw new EmailFormatException("E-mail需要包含'@'"); } try { checkEmail('gmail.com'); } catch (EmailFormatException $e){ $e->printMessage(); } ?>
- 多層次的例外處理
- 執行程式時,可能會發生多種情況的例外,可以寫多個 catch 來補抓例外!
- 例 : multiCatchExp.php
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
本章練習:
- 修改你的 dog、cat、Human 類別,別讓它被餵食錯誤的飼料,例如:Human 不可以吃 cat 罐頭!