最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于ThinkPHP中的異常處理詳解

 更新時(shí)間:2018年05月11日 11:54:42   作者:菲貓的狗  
和PHP默認(rèn)的異常處理不同,ThinkPHP拋出的不是單純的錯(cuò)誤信息,而是一個(gè)人性化的錯(cuò)誤頁(yè)面,下面這篇文章主要給大家介紹了關(guān)于ThinkPHP中異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

什么是異常

從更加廣泛的角度來(lái)看,異常包含兩個(gè)方面,一方面是程序執(zhí)行時(shí)由于語(yǔ)法、運(yùn)行時(shí)錯(cuò)誤等導(dǎo)致的異常,一方面時(shí)沒有給予正確的反饋,如客戶端要查詢某個(gè)產(chǎn)品,沒有查詢到,我認(rèn)為這也屬于異常的一種。

第一種異常TP框架本身會(huì)在頁(yè)面中輸出錯(cuò)誤信息,但是第二種異常則一般不會(huì)輸出任何信息,所以非常不方便調(diào)試。

本文將詳細(xì)介紹關(guān)于ThinkPHP異常處理的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

前提環(huán)境

現(xiàn)在 PHP 在很多時(shí)候是為前端提供接口,所以我們的異常處理也基于這一點(diǎn)進(jìn)行處理。

在開發(fā)階段,TP 原有的異常處理是在頁(yè)面中輸出異常信息,這一點(diǎn)能夠滿足需求,但在生產(chǎn)環(huán)境中,則需要以其他方式處理異常。

本文都是針對(duì)生產(chǎn)環(huán)境的異常處理

AOP 編程

現(xiàn)在在很多語(yǔ)言中,都非常流行 AOP 編程思想,即面向切面編程思想,通俗的說(shuō),就是用統(tǒng)一的方式處理問題,而不是用相同的方式分別處理多個(gè)問題,對(duì)于異常處理來(lái)說(shuō),就是定義統(tǒng)一的異常信息,用統(tǒng)一的方式處理

大致思路

自定義異常處理類,重寫默認(rèn)異常處理類的 render 方法,然后配置使用自定義異常處理類處理所有異常

代碼實(shí)現(xiàn)

在根目錄下創(chuàng)建目錄 exception,在其下創(chuàng)建ExceptionHandle.php,此類要繼承 handle 類

class ExceptionHandler extends Handle 

創(chuàng)建幾個(gè)屬性,用于定義異常信息

// http 錯(cuò)誤碼 
private $code; 
// 自定義異常信息 
private $msg; 
// 自定義錯(cuò)誤碼 
private $errorCode; 

覆蓋 Handle 類中的render 方法,當(dāng)我們?cè)诖a中使用 throw new Exception() 方式拋出異常信息時(shí),其實(shí)就是調(diào)用了 render 方法,所以我們要重寫此方法,以返回我們自己的信息

public function render(Exception $ex) 
 { 
 return json(['msg'=>"自定義異常信息"]); 
nbsp; } 

下面新建控制器 Product,添加方法,進(jìn)行測(cè)試

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

然后添加如下路由

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

輸入如下url 測(cè)試

http://z.cn/product/2

頁(yè)面輸出結(jié)果如下

可見,其并沒有執(zhí)行自定義異常處理函數(shù)。

使用自定義的異常處理

在 config.php 中修改如下配置

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

然后再運(yùn)行

自定義異常處理類

一類異常是用戶行為導(dǎo)致的異常,比如沒有查詢到符合條件的數(shù)據(jù)(從另一個(gè)角度來(lái)說(shuō),這其實(shí)不算異常),一類錯(cuò)誤是運(yùn)行時(shí)錯(cuò)誤。而用戶導(dǎo)致的異??赡芊譃楹芏喾N,所以需要自定義相關(guān)的類。

首先定義一個(gè)父類

class BaseException extends Exception 
{ 
 //http 狀態(tài)碼 
 public $code; 
//錯(cuò)誤具體消息 
 public $msg; 
//自定義錯(cuò)誤碼 
 public $errorCode; 
 
 //構(gòu)造函數(shù)用于接收傳入的異常信息,并初始化類中的屬性 
 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']; 
  } 
 } 
} 

再定義一個(gè)處理找不到產(chǎn)品信息的異常處理類,用來(lái)重寫父類中的各個(gè)屬性,而且這個(gè)類中的屬性信息也可能會(huì)被修改,如 msg

class ProductNotFoundException extends BaseException 
{ 
 //http 狀態(tài)碼 
 public $code = 404; 
//錯(cuò)誤具體消息 
 public $msg = "請(qǐng)求的產(chǎn)品不存在"; 
//自定義錯(cuò)誤碼 
 public $errorCode = 40000; 
} 

處理不同異常

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

//分別處理兩種不容類型異常:1、用戶錯(cuò)誤 2.代碼與運(yùn)行時(shí)錯(cuò)誤 
  if ($ex instanceof BaseException) { 
 
  } else { 
  
  } 

說(shuō)明:在 throw 異常時(shí),會(huì)執(zhí)行 render 函數(shù),同時(shí)會(huì)將拋出的異常對(duì)象復(fù)制給參數(shù) $ex,所以可以根據(jù)此參數(shù)判斷異常類型

現(xiàn)在的關(guān)鍵是生產(chǎn)環(huán)境,所以希望返回的異常信息,前端人員能夠看懂,而不是像上面那樣在頁(yè)面中輸出錯(cuò)誤信息,還包括堆棧信息等。

那么前前端賀后端人員都能夠看懂的信息一定是 json(當(dāng)然也可以是xml)了,修改 render 方法

if ($ex instanceof BaseException) { 
   $this->code = $ex->code; 
   $this->msg = $ex->msg; 
   $this->errorCode = $ex->errorCode; 
  } else { 
//這里是在運(yùn)行時(shí)產(chǎn)生的各種異常,所以無(wú)法準(zhǔn)確輸出異常信息,所以只能統(tǒng)一輸出是服務(wù)器錯(cuò)誤信息 
   $this->code = 500; 
   $this->msg = "服務(wù)器內(nèi)部錯(cuò)誤"; 
   $this->errorCode = 999; 
  } 

然后以 json 格式返回錯(cuò)誤信息

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

至此,全局的異常處理就編寫好了,下面在 product.php 中編碼進(jìn)行測(cè)試

public function getProduct($id) 
 { 
  //處理程序運(yùn)行時(shí)錯(cuò)誤 
  /*try{ 
   3/0; 
  } 
  catch(Exception $ex){ 
   throw $ex; 
  }*/ 
  //處理用戶行為產(chǎn)生的錯(cuò)誤 
  $error=[ 
   'msg'=>'沒有找到合適的產(chǎn)品' 
  ]; 
  $ex=new ProductNotFoundException($error); 
  throw $ex; 
 } 

提示:生產(chǎn)環(huán)境不要忘了將 app_debug 修改為 false

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • PHP模板引擎smarty詳細(xì)介紹

    PHP模板引擎smarty詳細(xì)介紹

    這篇文章主要介紹了PHP模板引擎smarty詳細(xì)介紹,本文講解了什么是smarty、smarty優(yōu)點(diǎn)、不適合使用smarty的地方、smarty目錄結(jié)構(gòu)及版本,需要的朋友可以參考下
    2015-05-05
  • PHP 透明水印生成代碼

    PHP 透明水印生成代碼

    PHP 透明水印生成代碼,需要的朋友可以參考下
    2012-08-08
  • php中遍歷二維數(shù)組并以表格的形式輸出的方法

    php中遍歷二維數(shù)組并以表格的形式輸出的方法

    本篇文章主要介紹了php中遍歷二維數(shù)組并以表格的形式輸出,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • workerman結(jié)合laravel開發(fā)在線聊天應(yīng)用的示例代碼

    workerman結(jié)合laravel開發(fā)在線聊天應(yīng)用的示例代碼

    聊天功能是很常見的一種功能,Workerman是一款開源高性能異步PHP socket即時(shí)通訊框架。這篇文章主要介紹了workerman結(jié)合laravel開發(fā)在線聊天應(yīng)用,感興趣的小伙伴們可以參考一下
    2018-10-10
  • laravel框架 api自定義全局異常處理方法

    laravel框架 api自定義全局異常處理方法

    今天小編就為大家分享一篇laravel框架 api自定義全局異常處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-10-10
  • php fseek函數(shù)讀取大文件兩種方法

    php fseek函數(shù)讀取大文件兩種方法

    php中讀取文件非常簡(jiǎn)單,但如果讀取的文件非常大,改如何解決呢?我們可以直接使用fseek來(lái)進(jìn)行大文件操作,本文章向大家介紹php使用fseek函數(shù)讀取大文件,需要的朋友可以參考一下
    2016-10-10
  • 詳解Yii2 之 生成 URL 的方法

    詳解Yii2 之 生成 URL 的方法

    本篇文章主要介紹了Yii2 之 生成 URL 的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-06-06
  • PHP實(shí)現(xiàn)文件上傳功能實(shí)例代碼

    PHP實(shí)現(xiàn)文件上傳功能實(shí)例代碼

    這篇文章主要介紹了PHP實(shí)現(xiàn)文件上傳功能實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-05-05
  • PHP數(shù)據(jù)類型之布爾型的介紹

    PHP數(shù)據(jù)類型之布爾型的介紹

    布爾類型是PHP中 最簡(jiǎn)單的類型。它的值可以為 TRUE 或 FALSE
    2013-04-04
  • php篩選不存在的圖片資源

    php篩選不存在的圖片資源

    本文給大家匯總了幾個(gè)使用php實(shí)現(xiàn)篩選不存在圖片資源的方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-04-04

最新評(píng)論

云龙县| 阿拉尔市| 灵丘县| 霸州市| 房产| 清新县| 黑山县| 金塔县| 宁乡县| 威宁| 浦城县| 措勤县| 平湖市| 万源市| 富蕴县| 湟中县| 娄烦县| 苗栗县| 东乡族自治县| 桐庐县| 余姚市| 南宫市| 房产| 柞水县| 观塘区| 巧家县| 巫山县| 莆田市| 宝山区| 珲春市| 太原市| 庆阳市| 民县| 信丰县| 桓仁| 濮阳市| 同江市| 牟定县| 海盐县| 广东省| 财经|