2021年3月14日 星期日

PHP 錯誤與例外處理

設定目標:
  • 了解 PHP 錯誤與例外發生時的處理方式

PHP 處理錯誤與例外發生的方式
  1. 掌握錯誤與例外
    • 避免非預期的結果干擾使用者!
    • 強化安全性,避免惡意的使用者查覺系統問題!
    • 在預期錯誤發生時,仍可導入正常處理流程!
  2. 錯誤的情況處理分類
    • 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);
      ?>
      
  3. 錯誤與例外的不同
    • 例外是可以抛出與接收處理,但錯誤則是無法恢復!
    • 例外可以使用物件導向的方式來掌握與處理!
  4. 例外的情況處理分類
    • 注意(Notice): 不嚴重的問題,程式也不會停止
    • 警告(Warning): 程式碼有錯誤,但程式亦不會停止執行
    • 致命錯誤 (Fata Error): 遇上嚴重錯誤,程式停止執行
  5. try…catch 敘述
    • 語法
      try {
        可能會發生錯誤的程式碼;
      } catch(Exception $e){
        處理例外的程式碼;
      }
      
    • Exception 是 PHP 處理例外的類別
      • 屬性值有兩個,一個是訊息,另一個則是代號值
      • 訊息會描述程式產生錯誤的地方
      • 代號值為錯誤代碼
      • 使用的語法 : 可以自行抛出 Exception
        throw new Exception('Error Message', 100);
        
  6. 抛出例外與接收
    • 當程式抛出例外時,程式會自動暫停,接下來的程式碼也不會運作!
    • 例 : 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()."
      "; } ?>
  7. 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(); } ?>
  8. 多層次的例外處理
    • 執行程式時,可能會發生多種情況的例外,可以寫多個 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 罐頭!