婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 如何重寫Laravel異常處理類詳解

如何重寫Laravel異常處理類詳解

熱門標簽:gps 地圖標注軟件 招標自動語音外呼系統 地圖標注視頻廣告入駐 OMG地圖標注app 400電話鄭州申請 電銷機器人便宜的有嗎 中原區電話機器人價格 ai電話機器人加盟代理 黔江400電話如何辦理

現在開發前后端分離變得越來越流行了,后端只提供接口返回json格式的數據,即使是錯誤信息也要以json格式來返回,然而目前無論是Laravel框架還是ThinkPHP框架,都只提供了返回json數據的方法,對異常的處理并不是以json格式來返回給我們,所以這里就需要我們自己來改寫。

首先我們在app/Exceptions目錄新建一個ExceptionHandler.php繼承自Handler.php

namespace App\Exceptions;


class ExceptionHandler extends Handler
{

}

然后我們在bootstrap/app.php中,使用我們自定義的異常處理類ExceptionHandler替換掉默認的Handler類

//改為我們自定義的ExceptionHandler類
$app->singleton(
 Illuminate\Contracts\Debug\ExceptionHandler::class,
 App\Exceptions\ExceptionHandler::class
);

接下來我們就開始重寫渲染方法

在render方法里,我們根據.env文件中的APP_DEBUG來判斷,如果是調試模式,我們還是按照默認方式來渲染錯誤,如果是非調試模式,我們就返回JSON格式的信息

namespace App\Exceptions;

use Exception;

class ExceptionHandler extends Handler
{
 public function render($request, Exception $exception)
 {
 if (env('APP_DEBUG')) {
  return parent::render($request, $exception);
 }
 return response()->json([
  'code' => $exception->getCode(),
  'msg' => $exception->getMessage()
 ]);
 }
}

這樣我們就可以根據APP_DEBUG的值設置是否返回JSON格式的數據了,現在我們把.env的APP_DEBUG的值設為false來測試一下,然后我們故意把代碼寫錯,通過postman或瀏覽器來訪問接口

Route::get('/', function () {
 //這是一段缺少了分號的代碼,會報異常
 echo 'Hello World!'
});

在APP_DEBUG=true的情況下還仍然是默認渲染,方便我們查找錯誤排錯

異常類默認會把異常以日志的形式記錄在storage/logs目錄下,并且以laravel-日期(YYYY-MM-DD)命名的形式,.log為后綴保存錯誤日志

我們打開這個日志文件查看記錄的錯誤信息,我們可以發現錯誤信息記錄的非常詳細,除了錯誤說明之外,還記錄了調用棧,如下圖所示

基本上紅框里的信息就夠我們排錯了,不需要像現在這樣記錄的這么詳細,所以要想不記錄調用棧,我們可以重寫report方法

首先我們看一下框架的report方法,代碼在(src/Illuminate/Foundation/Exceptions/Handler.php),我用紅框框起來的代碼就是調用棧信息,我們在重寫這個方法時只需要完全拷貝這個方法里的所有代碼到我們自定義的report方法里,然后把紅框里的代碼去掉即可

我們在我們自定義的異常處理類ExceptionHandler.php中重寫report方法

public function report(Exception $exception)
{
 if ($this->shouldntReport($exception)) {
 return;
 }

 if (Reflector::isCallable($reportCallable = [$exception, 'report'])) {
 return $this->container->call($reportCallable);
 }

 try {
 $logger = $this->container->make(LoggerInterface::class);
 } catch (Exception $ex) {
 throw $exception;
 }

 $logger->error(
 $exception->getMessage()
 );
}

然后我們再重新請求一下接口再去查看錯誤日志的記錄,可以發現確實沒有記錄調用棧信息了,但是下面的信息還是不夠,我們沒法根據下面的信息判斷錯誤發生在哪一個文件和哪一行,如果能在記錄錯誤信息的時候同時記錄發生錯誤的文件和行就更好了,所以借著修改report方法

public function report(Exception $exception)
{
 if ($this->shouldntReport($exception)) {
 return;
 }

 if (Reflector::isCallable($reportCallable = [$exception, 'report'])) {
 return $this->container->call($reportCallable);
 }

 try {
 $logger = $this->container->make(LoggerInterface::class);
 } catch (Exception $ex) {
 throw $exception;
 }

 $logger->error(
 $exception->getMessage()." at ".$exception->getFile().":".$exception->getLine()
 );
}

在代碼里我通過exception的getFile()、getLine()方法加上了文件和行數,保存代碼再次訪問接口,查看錯誤日志文件我們可以看到發生錯誤的文件和行數已經記錄下來了,有了這些信息基本我們就可以找到錯誤

截止到這里實現最初的需求我們的ExceptionHandler.php只需要有這些代碼

namespace App\Exceptions;


use Exception;
use Illuminate\Support\Reflector;
use Psr\Log\LoggerInterface;

class ExceptionHandler extends Handler
{

 public function render($request, Exception $exception)
 {
 if (env('APP_DEBUG')) {
  return parent::render($request, $exception);
 }
 return response()->json([
  'code' => $exception->getCode(),
  'msg' => $exception->getMessage()
 ]);
 }

 public function report(Exception $exception)
 {
 if ($this->shouldntReport($exception)) {
  return;
 }

 if (Reflector::isCallable($reportCallable = [$exception, 'report'])) {
  return $this->container->call($reportCallable);
 }

 try {
  $logger = $this->container->make(LoggerInterface::class);
 } catch (Exception $ex) {
  throw $exception;
 }

 $logger->error(
  $exception->getMessage()." at ".$exception->getFile().":".$exception->getLine()
 );
 }
}

然后還不夠,我們發現剛剛我們把服務器端的錯誤信息以JSON格式返回給客戶端了,這是不允許的,我們應該只把一些客戶端錯誤返回給客戶端,比如密碼不足六位、身份證不合法諸如此類,而服務端出現錯誤時我們只返回給客戶端一個模糊的信息即可,比如“服務器錯誤”,把真實的服務器錯誤信息記錄在日志里面方便開發人員排查錯誤

所以我們需要定義一個客戶端異常專門用戶返回客戶端錯誤,使用如下命令在app/Exceptions目錄下生成一個ClientException.php文件

php artisan make:exception ClientException

修改為構造方法為如下代碼

namespace App\Exceptions;

use Exception;

class ClientException extends Exception
{
 public function __construct($code, $msg)
 {
 parent::__construct($msg, $code);
 }
}

接著我們繼續修改ExceptionHandler.php

namespace App\Exceptions;


use Exception;
use Illuminate\Support\Reflector;
use Psr\Log\LoggerInterface;

class ExceptionHandler extends Handler
{
 /**
 * @var int 錯誤碼
 */
 protected $code;
 /**
 * @var string 錯誤信息
 */
 protected $message;

 protected $dontReport = [
 ClientException::class
 ];

 public function render($request, Exception $exception)
 {
 if ($exception instanceof ClientException) {
  $this->code = $exception->getCode();
  $this->message = $exception->getMessage();
 } else {
  if (env('APP_DEBUG')) {
  return parent::render($request, $exception);
  }
  
  $this->code = 500;
  $this->message = '服務器錯誤';
 }
 
 return response()->json([
  'code' => $this->code,
  'msg' => $this->message
 ]);
 }

 public function report(Exception $exception)
 {
 if ($this->shouldntReport($exception)) {
  return;
 }

 if (Reflector::isCallable($reportCallable = [$exception, 'report'])) {
  return $this->container->call($reportCallable);
 }

 try {
  $logger = $this->container->make(LoggerInterface::class);
 } catch (Exception $ex) {
  throw $exception;
 }

 $logger->error(
  $exception->getMessage()." at ".$exception->getFile().":".$exception->getLine()
 );
 }
}

對于上面的修改做一下說明,laravel的$dontReport屬性的異常類都不會被上報,因為客戶端錯誤信息我們不需要記錄,所以將其添加到$dontReport屬性里,并且在render方法里把異常大概分為了兩大類,一大類就是客戶端異常,另一大類就是服務器異常,我們把服務器異常統一code為500,錯誤信息為服務器錯誤,將真實的錯誤信息記錄在了錯誤日志里,避免把服務器信息暴露給了客戶端。

現在我們來測試我們重寫異常的結果

假如我們想返回客戶端異常,比如沒有權限,這類客戶端異常在錯誤日志里都不會產生記錄,我們本身也不需要記錄

Route::get('/', function () {
 throw new \App\Exceptions\ClientException(403, '你沒有權限');
});

對于服務器端的錯誤,如少些了分號,客戶端就只會知道服務器的某個接口出了問題,但是不清楚具體問題是什么

Route::get('/', function () {
 echo 'Hello World!'
});

但是真實的錯誤信息會記錄在錯誤日志里,我們仍舊可以通過錯誤日志來修改我們服務端的錯誤

我們還可以在render方法中加入告警代碼,如果是服務端錯誤就給管理員發送郵件。

至此,我們的重寫Laravel異常處理類就算完成啦,希望對正在準備使用Laravel做前后端分離項目的你有所幫助。

到此這篇關于如何重寫Laravel異常處理類的文章就介紹到這了,更多相關重寫Laravel異常處理類內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Laravel如何實現適合Api的異常處理響應格式
  • Laravel 修改驗證異常的響應格式實例代碼詳解
  • laravel框架使用FormRequest進行表單驗證,驗證異常返回JSON操作示例
  • Laravel 解決composer相關操作提示php相關異常的問題
  • Laravel 5.5 異常處理 & 錯誤日志的解決
  • 解決laravel 表單提交-POST 異常的問題
  • laravel框架 api自定義全局異常處理方法
  • Laravel核心解讀之異常處理的實踐過程
  • 淺談Laravel中使用Slack進行異常通知

標簽:那曲 濟源 哈密 池州 孝感 阿里 北京 日照

巨人網絡通訊聲明:本文標題《如何重寫Laravel異常處理類詳解》,本文關鍵詞  如何,重寫,Laravel,異常,處理,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何重寫Laravel異常處理類詳解》相關的同類信息!
  • 本頁收集關于如何重寫Laravel異常處理類詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精一区二区三区| 国内精品免费**视频| 日韩视频在线一区二区| 成人免费毛片嘿嘿连载视频| 免费成人美女在线观看| 中文字幕中文字幕中文字幕亚洲无线| 91精品国产aⅴ一区二区| av成人免费在线| 狠狠色狠狠色合久久伊人| 亚洲图片你懂的| 精品国产乱码久久久久久蜜臀| 91久久精品一区二区三| 国产不卡在线播放| 免费人成精品欧美精品| 亚洲综合丁香婷婷六月香| 国产欧美视频一区二区三区| 日韩视频在线一区二区| 欧美日韩一级视频| 色香色香欲天天天影视综合网| 国产精品综合av一区二区国产馆| 午夜精品久久久久久久蜜桃app| 国产精品乱码久久久久久| 欧美第一区第二区| 欧美久久久影院| 欧美天堂亚洲电影院在线播放| 99re热视频这里只精品| 成人综合日日夜夜| 国产一区二区三区国产| 久久精品99国产精品日本| 日韩av电影天堂| 亚洲福利视频一区| 亚洲精品美国一| 一区二区三区小说| 亚洲欧美日韩在线不卡| 国产精品欧美一区二区三区| 欧美韩国日本一区| 久久久不卡网国产精品二区| 久久蜜桃av一区二区天堂| 亚洲精品一区二区三区精华液| 欧美mv和日韩mv的网站| 精品日产卡一卡二卡麻豆| 精品欧美乱码久久久久久| 欧美美女一区二区在线观看| 欧美日本韩国一区| 欧美日韩大陆一区二区| 欧美疯狂做受xxxx富婆| 欧美一区二区性放荡片| 欧美成人伊人久久综合网| 精品国产一区a| 亚洲精品一区二区三区蜜桃下载 | 精品久久一区二区| 日韩女同互慰一区二区| 久久综合久色欧美综合狠狠| 久久在线观看免费| 欧美国产综合一区二区| 亚洲天堂网中文字| 亚洲成va人在线观看| 麻豆国产91在线播放| 国产成都精品91一区二区三| av日韩在线网站| 欧美少妇一区二区| 日韩久久免费av| 亚洲国产精品二十页| 亚洲免费观看高清完整版在线观看熊| 亚洲欧美电影院| 亚洲中国最大av网站| 裸体一区二区三区| 成人免费毛片a| 欧美揉bbbbb揉bbbbb| 日韩一区二区三区四区| 中文字幕精品—区二区四季| 一区二区三区四区视频精品免费| 日韩中文字幕亚洲一区二区va在线| 免播放器亚洲一区| 波多野结衣中文一区| 欧美精品 国产精品| 国产女人水真多18毛片18精品视频| 亚洲欧美日韩在线| 九一九一国产精品| 色综合久久综合网97色综合| 欧美成人aa大片| 自拍偷拍国产精品| 蜜臀av性久久久久蜜臀av麻豆 | 欧美日韩在线三区| 欧美成人一区二区三区在线观看| 国产精品电影一区二区| 日本不卡免费在线视频| 国产激情一区二区三区桃花岛亚洲| 色噜噜久久综合| 久久综合av免费| 亚洲最大的成人av| 国产经典欧美精品| 欧美高清视频在线高清观看mv色露露十八| 国产片一区二区三区| 欧美a级理论片| 91小视频免费观看| 国产欧美一区二区三区沐欲| 青青国产91久久久久久| 99re这里只有精品视频首页| 日韩你懂的在线播放| 一区二区三区国产豹纹内裤在线| 极品美女销魂一区二区三区免费| 色素色在线综合| 国产亚洲精品福利| 日韩精品每日更新| 91麻豆国产精品久久| 精品国产91洋老外米糕| 亚洲第一福利视频在线| 国产成人av福利| 精品久久久久久久久久久久久久久久久 | 成人自拍视频在线观看| 日韩欧美区一区二| 午夜欧美一区二区三区在线播放| 99精品国产视频| 国产亚洲精久久久久久| 激情深爱一区二区| 日韩视频一区在线观看| 午夜伊人狠狠久久| 色94色欧美sute亚洲13| 中文字幕一区不卡| 丁香激情综合五月| 久久精品人人做人人爽人人| 老司机一区二区| 欧美一级爆毛片| 日本伊人色综合网| 欧美精品乱码久久久久久按摩 | 九色|91porny| 欧美变态口味重另类| 久久机这里只有精品| 欧美一级片在线看| 免费精品视频在线| 日韩欧美电影一二三| 美女尤物国产一区| 欧美r级电影在线观看| 国产尤物一区二区| 久久久五月婷婷| 成人av综合在线| 亚洲美女屁股眼交3| 欧美日韩在线亚洲一区蜜芽| 日韩精品亚洲专区| 欧美一级片在线观看| 老司机精品视频线观看86| 日韩亚洲欧美在线| 国产精品99久| 亚洲欧美日韩国产中文在线| 91国在线观看| 日韩成人av影视| 久久综合久久99| 成人aa视频在线观看| 亚洲一区二区三区免费视频| 91麻豆精品国产91久久久久久| 久久 天天综合| 国产精品成人免费在线| 欧美综合色免费| 美腿丝袜在线亚洲一区| 久久青草欧美一区二区三区| 成人午夜在线播放| 亚洲福利视频导航| 2020国产精品自拍| 91丨porny丨国产| 日韩国产在线观看一区| 久久综合色婷婷| 97精品电影院| 久久精品国产精品亚洲综合| 国产精品久久综合| 欧美日韩精品免费| 国产精品99久久久久久宅男| 亚洲黄色尤物视频| 欧美成人一区二区三区| 91视频国产观看| 蜜臀av在线播放一区二区三区| 国产精品久久久久久久久图文区 | 日韩午夜三级在线| 成人av动漫网站| 日本不卡中文字幕| 国产精品另类一区| 在线播放国产精品二区一二区四区| 国产成人免费视频一区| 亚洲成人精品在线观看| 国产欧美日韩在线观看| 欧美精品123区| 91色porny| 国产精品99久| 日韩av电影免费观看高清完整版 | 一区二区理论电影在线观看| 久久综合九色综合久久久精品综合 | 欧美aaaaa成人免费观看视频| 综合久久久久久| 久久久久久夜精品精品免费| 色综合久久88色综合天天| 国产乱子伦视频一区二区三区 | 人妖欧美一区二区| 亚洲欧美自拍偷拍色图| 欧美精品一区二区三| 欧美日韩国产中文| 92精品国产成人观看免费| 韩国欧美国产一区| 日韩成人一级片| 午夜视频在线观看一区二区 | 久久久噜噜噜久久中文字幕色伊伊|