關於ThinkPHP中的異常處理詳解_php執行個體

來源:互聯網
上載者:User
和PHP預設的異常處理不同,ThinkPHP拋出的不是單純的錯誤資訊,而是一個人性化的錯誤頁面,下面這篇文章主要給大家介紹了關於ThinkPHP中異常處理的相關資料,文中通過範例程式碼介紹的非常詳細,需要的朋友可以參考下

什麼是異常

從更加廣泛的角度來看,異常包含兩個方面,一方面是程式執行時由於文法、執行階段錯誤等導致的異常,一方面時沒有給予正確的反饋,如用戶端要查詢某個產品,沒有查詢到,我認為這也屬於異常的一種。

第一種異常TP架構本身會在頁面中輸出錯誤資訊,但是第二種異常則一般不會輸出任何資訊,所以非常不方便調試。

本文將詳細介紹關於ThinkPHP異常處理的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

前提環境

現在 PHP 在很多時候是為前端提供介面,所以我們的異常處理也基於這一點進行處理。

在開發階段,TP 原有的異常處理是在頁面中輸出異常資訊,這一點能夠滿足需求,但在生產環境中,則需要以其他方式處理異常。

本文都是針對生產環境的異常處理

AOP 編程

現在在很多語言中,都非常流行 AOP 編程思想,即面向切面編程思想,通俗的說,就是用統一的方式處理問題,而不是用相同的方式分別處理多個問題,對於異常處理來說,就是定義統一的異常資訊,用統一的方式處理

大致思路

自訂異常處理類,重寫預設異常處理類的 render 方法,然後配置使用自訂異常處理類處理所有異常

代碼實現

在根目錄下建立目錄 exception,在其下建立ExceptionHandle.php,此類要繼承 handle 類

class ExceptionHandler extends Handle

建立幾個屬性,用於定義異常資訊

// http 錯誤碼 private $code; // 自訂異常資訊 private $msg; // 自訂錯誤碼 private $errorCode;

覆蓋 Handle 類中的render 方法,當我們在代碼中使用 throw new Exception() 方式拋出異常資訊時,其實就是調用了 render 方法,所以我們要重寫此方法,以返回我們自己的資訊

public function render(Exception $ex)  {  return json(['msg'=>"自訂異常資訊"]); nbsp; }

下面建立控制器 Product,添加方法,進行測試

public function getProduct($id)  {  try{   3/0;  }  catch(Exception $ex){   throw $ex;  }  }

然後添加如下路由

Route::get("product/:id","api/v1.Product/getProduct");

輸入如下url 測試

http://z.cn/product/2

頁面輸出結果如下

可見,其並沒有執行自訂異常處理函數。

使用自訂的異常處理

在 config.php 中修改如下配置

// 異常處理handle類 留空使用 \think\exception\Handle  'exception_handle' => 'app\lib\exception\ExceptionHandler',

然後再運行

自訂異常處理類

一類異常是使用者行為導致的異常,比如沒有查詢到合格資料(從另一個角度來說,這其實不算異常),一類錯誤是執行階段錯誤。而使用者導致的異常可能分為很多種,所以需要自訂相關的類。

首先定義一個父類

class BaseException extends Exception {  //http 狀態代碼  public $code; //錯誤具體訊息  public $msg; //自訂錯誤碼  public $errorCode;   //建構函式用於接收傳入的異常資訊,並初始化類中的屬性  public function __construct($params)  {   if (!is_array($params)) {    return;   }   if (array_key_exists('code', $params)) {    $this->code = $params['code'];   }   if (array_key_exists('msg', $params)) {    $this->msg = $params['msg'];   }   if (array_key_exists('errorCode', $params)) {    $this->errorCode = $params['errorCode'];   }  } }

再定義一個處理找不到產品資訊的異常處理類,用來重寫父類中的各個屬性,而且這個類中的屬性資訊也可能會被修改,如 msg

class ProductNotFoundException extends BaseException {  //http 狀態代碼  public $code = 404; //錯誤具體訊息  public $msg = "請求的產品不存在"; //自訂錯誤碼  public $errorCode = 40000; }

處理不同異常

在 render 方法中,根據異常的不同分別處理

//分別處理兩種不容類型異常:1、使用者錯誤 2.代碼與執行階段錯誤   if ($ex instanceof BaseException) {    } else {     }

說明:在 throw 異常時,會執行 render 函數,同時會將拋出的異常對象複製給參數 $ex,所以可以根據此參數判斷異常類型

現在的關鍵是生產環境,所以希望返回的異常資訊,前端人員能夠看懂,而不是像上面那樣在頁面中輸出錯誤資訊,還包括堆棧資訊等。

那麼前前端賀後端人員都能夠看懂的資訊一定是 json(當然也可以是xml)了,修改 render 方法

if ($ex instanceof BaseException) {    $this->code = $ex->code;    $this->msg = $ex->msg;    $this->errorCode = $ex->errorCode;   } else { //這裡是在運行時產生的各種異常,所以無法準確輸出異常資訊,所以只能統一輸出是伺服器錯誤資訊    $this->code = 500;    $this->msg = "伺服器內部錯誤";    $this->errorCode = 999;   }

然後以 json 格式返回錯誤資訊

$result = [    'msg' => $this->msg,    'error_code' => $this->errorCode,    'request_url' => request()->url()   ];   return json($result,$this->code);

至此,全域的異常處理就編寫好了,下面在 product.php 中編碼進行測試

public function getProduct($id)  {   //處理常式執行階段錯誤   /*try{    3/0;   }   catch(Exception $ex){    throw $ex;   }*/   //處理使用者行為產生的錯誤   $error=[    'msg'=>'沒有找到合適的產品'   ];   $ex=new ProductNotFoundException($error);   throw $ex;  }

提示:生產環境不要忘了將 app_debug 修改為 false

總結

您可能感興趣的文章:

PHP7基於curl實現的上傳圖片功能php技巧

PHP區塊查詢實現方法分析php技巧

PHP5.0~5.6 各版本相容性cURL檔案上傳功能執行個體分析php技巧






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.