午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > 如何重寫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異常處理類詳解的相關信息資訊供網民參考!
  • 推薦文章
    日本一区二区久久精品| 国产三级三级三级精品8ⅰ区| 日本成人午夜影院| 中国丰满熟妇xxxx性| 51国产成人精品午夜福中文下载| 在线日韩精品视频| 日韩精品一区二区三区中文精品| 亚洲电影在线播放| 国产精品乱子久久久久| 国产精品123| 水野朝阳av一区二区三区| 日本三级网站在线观看| 国产视频123区| 中文字幕免费高清| 97伦伦午夜电影理伦片| 古装做爰无遮挡三级聊斋艳谭| 老太脱裤子让老头玩xxxxx| 宅男av一区二区三区| 亚洲激情一区二区三区| 久久精品国产精品国产精品污| 99视频日韩| 亚洲一区亚洲二区| 99精彩视频| 精品视频高清无人区区二区三区| 国产欧美日韩最新| 91免费精品国偷自产在线| 91色在线视频| 精品欧美国产一区二区三区不卡| 不卡一卡2卡3卡4卡精品在| 99国产视频在线| 免费国产一区二区| 国产精品久久成人免费观看| 免费的一级黄色片| 欧美视频第三页| 91福利免费观看| 性欧美成人播放77777| 自拍偷拍第9页| 亚洲大片免费观看| 国产强被迫伦姧在线观看无码| 国产乱淫a∨片免费视频| 久久精品麻豆| 久久蜜桃香蕉精品一区二区三区| 欧美高清在线一区二区| 婷婷一区二区三区| 亚洲免费av片| 国产精品专区一| 明星裸体视频一区二区| 97超碰在线视| 波多野结衣电影免费观看| 亚洲国产天堂av| wwwwww在线观看| 国产一区二区三区在线观看精品| 久久久久国产精品麻豆| 色综合咪咪久久| 亚洲欧美一区二区三区在线| 欧美又大又粗又长| 手机在线观看国产精品| 狠狠干狠狠操视频| 国产午夜福利片| 日韩国产欧美在线视频| 中文幕一区二区三区久久蜜桃| 欧美日韩国产乱码电影| 久久久久久尹人网香蕉| 欧美性bbwbbwbbwhd| 爆乳熟妇一区二区三区霸乳| 男人舔女人下部高潮全视频 | 岛国av中文字幕| 国产一区二区三区蝌蚪| 黑人极品videos精品欧美裸| 久久精品国亚洲| 亚洲一区综合| 538精品视频| 国产成人a人亚洲精品无码| 久久精品夜色噜噜亚洲a∨| 亚洲精品国产无天堂网2021| 欧美成人aa大片| 国产精品自拍首页| 九九热精品国产| 国产一区二区麻豆| 麻豆精品新av中文字幕| 欧美卡1卡2卡| 亚洲www在线| 国产激情第一页| 黄色av网站免费在线观看| 亚洲午夜电影在线| 国产a∨精品一区二区三区不卡| 日韩第一页在线观看| 久久精品国产亚洲AV无码男同| 北条麻妃一区二区三区| 亚洲男人天堂古典| 神马影院我不卡午夜| 夫妇露脸对白88av| 97成人超碰视| 欧美丰满少妇xxxxx| 男人和女人啪啪网站| 一级特黄录像免费看| 色综合久久久久综合| 国产精品入口夜色视频大尺度 | 欧美影院一区二区三区| 国产日韩在线一区二区三区| 亚洲av无码一区二区三区在线| 国产欧美综合在线观看第十页| 久久影院模特热| 成人黄色片视频| 天堂中文在线官网| 精品国产髙清在线看国产毛片| 久久亚洲一区二区| 香蕉污视频在线观看| 在线精品亚洲一区二区不卡| 精品网站在线看| 日韩不卡高清视频| 欧美日韩精品电影| 日韩av图片| 国产极品久久久| 亚洲欧美中文字幕| 色综合av综合无码综合网站| 九一九一国产精品| 欧美一级大片在线观看| 国产 欧美 在线| 一区二区三区中文字幕| 日韩一区免费观看| 欧美一级特黄aaaaaa| 精品国产欧美一区二区五十路| 最新中文字幕日本| 一区二区三区蜜桃网| 亚洲精品久久久久久一区二区| 亚洲精品911| 黄色www在线观看| 亚洲一二三区视频在线观看| 91综合免费在线| 国产美女福利视频| 欧美美女黄视频| 在线免费视频一区| 成人免费在线视频观看| 日本福利视频导航| 久久超碰97人人做人人爱| 国产精品免费视频久久久| 做爰视频毛片视频| 久久99精品久久久久久青青91 | 天天操夜夜操视频| 亚洲图片制服诱惑| 情侣偷拍对白清晰饥渴难耐| 欧美一区二区精美| 天堂www中文在线资源| 欧美日韩一区二区三区在线免费观看| 久久av高潮av| 中文字幕中文字幕一区二区| 警花观音坐莲激情销魂小说| 成人国产视频在线观看 | 精品亚洲乱码一区二区| 精品国产自在久精品国产| 国产美女精品久久| 日韩av在线看| 国产小视频在线看| 欧美国产日韩一区二区三区| 欧美一级做a爰片免费视频| 欧美激情视频免费观看| 国产精品午夜福利| 92国产精品久久久久首页| 美腿丝袜亚洲一区| 日韩欧美在线一区二区| 欧美国产欧美综合| 黄在线观看网站| 欧洲在线/亚洲| v8888av| 精品国偷自产在线视频| 夜夜躁很很躁日日躁麻豆| 国产精品久久久久久久久免费 | 欧美亚洲动漫精品| 九九热最新地址| 欧美激情视频在线观看| 久久经典综合| 伊人天天久久大香线蕉av色| 亚洲国产日韩一级| 一级黄色片大全| 欧美黑人性视频| 麻豆精品一区二区综合av| 日韩精品在线视频免费观看| 国产精品久久久久久久岛一牛影视 | 无码人妻丰满熟妇区bbbbxxxx | 成人精品在线观看| 亚洲男人的天堂在线aⅴ视频 | 亚洲国产精品系列| 99久久精品国产一区二区成人| 亚洲精品高清国产一线久久| 亚洲成人动漫一区| av大片免费观看| 午夜精品电影在线观看| 欧美精品高清视频| 天天操天天操天天干| 干日本少妇视频| 亚洲精品福利视频| 秋霞av鲁丝片一区二区| 日韩久久久久久久久久久久| 亚洲国产欧美一区二区丝袜黑人 | 亚洲欧美日韩网| 亚洲欧美日韩成人在线| 亚洲一级免费在线观看| 国模视频一区二区三区| 久久网站热最新地址| 9.1片黄在线观看| 国产麻豆乱码精品一区二区三区 | 成人在线看片| 日韩欧美中文字幕公布| 久久超碰97人人做人人爱| 李宗瑞91在线正在播放| 痴汉一区二区三区| 午夜成人免费视频| 波多野结衣在线观看一区| 国产a级一级片| 国产成人精品久久亚洲高清不卡| 中文字幕一区二区三区四区不卡 | 视频一区二区在线观看| 一区二区三区高清国产| 国产精品久久久久久久久快鸭| 国产深夜男女无套内射| 久久久久久久网站| 色狠狠桃花综合| 国产a精品视频| 国产农村妇女精品一区| 一区在线电影| 91精品国产免费久久久久久| 日韩欧美国产免费播放| 久久69国产一区二区蜜臀| 曰本女人与公拘交酡| 国产情侣av自拍| 成人黄色片网站| 亚洲欧美日韩一区在线| 中文字幕在线不卡一区| 久久激情中文| 视频一区二区三区四区五区| 国产综合内射日韩久| 日本福利视频导航| 成人有码在线视频| 国产视频在线一区二区| 一区二区高清免费观看影视大全| 久久精品盗摄| 国产一级免费视频| 9l视频白拍9色9l视频| 曰本色欧美视频在线| 亚洲欧美一区二区三区国产精品 | 精品国免费一区二区三区| 性做久久久久久久免费看| 国产成a人亚洲精品| 熟妇高潮一区二区高潮| 国产成人无码精品| 国产极品视频在线观看| 中文字幕人妻无码系列第三区| 97精品国产97久久久久久粉红| www.成人av.com| 7777精品久久久久久| 欧美日韩国产成人| 亚洲最新av在线网站| 亚洲电影在线看| 欧美日本一区二区| 欧美亚洲自拍偷拍| 天天av天天翘天天综合网 | 57pao精品| 午夜精品久久久久久久久久久久| 亚洲精品成人久久久| 日韩黄在线观看| 精品久久久久久无| 亚洲国产精品99久久| 在线看福利67194| 国产精品老牛影院在线观看| 久久精品国产99国产精品澳门 | 国产精品欧美一区二区三区| www.亚洲免费av| 久久精品人人做| 中文字幕亚洲一区二区av在线 | 91免费的视频在线播放| 国产精品欧美风情| 国产精品自拍首页| 一区在线电影| 成年网站在线播放| 国产精品嫩草69影院| 久久国产柳州莫菁门| 国产精品2020| 国产乱人乱偷精品视频a人人澡| 久久九九国产| 久久久五月婷婷| 午夜视频一区在线观看| 91精品欧美久久久久久动漫| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品久久久对白| 一区二区三区四区在线视频| 久青草视频在线播放| 一级黄色大片儿| 欧美成人三级视频| 亚洲成熟女性毛茸茸| 成人一区在线看| 亚洲电影第三页| 亚洲欧美日韩精品久久| 国产成人a亚洲精品| 日韩欧美手机在线| 奇米影视亚洲色图| 日本黄色免费观看| 西西44rtwww国产精品| 日日噜噜夜夜狠狠视频欧美人 | 男人操女人逼免费视频| 国产精品久久免费观看| www夜片内射视频日韩精品成人| 不卡视频免费播放| 7777精品伊人久久久大香线蕉的| 日韩经典中文字幕在线观看| 日韩免费观看av| www.69av| 国产日韩欧美在线观看视频| 日韩高清国产一区在线| 综合久久久久久| 亚洲欧美国产一区二区三区| 亚洲伊人一本大道中文字幕| 国产成人手机视频| 中文字幕在线播| 91麻豆文化传媒在线观看| 日韩亚洲欧美高清| 成人午夜一级二级三级| 手机看片国产精品| 在线免费观看av片| 亚洲另类中文字| 中文字幕日韩欧美| 日日噜噜噜夜夜爽亚洲精品 | 日本一区二区在线免费观看| 可以免费观看的毛片| 欧美性感一类影片在线播放| 欧洲s码亚洲m码精品一区| 538在线视频观看| 精品久久久免费视频| 色哟哟国产精品免费观看| 97久久精品视频| 视频区 图片区 小说区| 石原莉奈在线亚洲三区| 日韩欧美激情四射| 午夜一区二区三视频在线观看| 欧美日韩在线国产| 亚洲美腿欧美偷拍| 国产精品日韩专区| av网页在线观看| 精品在线一区二区三区| 色偷偷噜噜噜亚洲男人| 国产成人a亚洲精v品无码| 亚洲欧美综合自拍| 欧美日韩午夜剧场| 国产一区再线| 精品无码久久久久久久| 婷婷成人综合网| 国产一区二区三区色淫影院| 精品人妻在线播放| 午夜精品久久久久久久久久久 | 91视频免费网站| 希岛爱理中文字幕| 天天影视涩香欲综合网| 秋霞毛片久久久久久久久| 中文天堂在线资源| 欧美一区二区三区影视| 日本免费不卡一区二区| 免费黄网站欧美| 精品中文字幕在线观看| 日韩精品无码一区二区三区久久久| 久久先锋影音av鲁色资源| 国产精品www色诱视频| 日产亚洲一区二区三区| 精品国产乱码久久久久久免费| 精品久久久噜噜噜噜久久图片 | 精品久久久久久亚洲| 国产农村妇女毛片精品久久| 亚洲视频一区二区三区| 欧美xxxx×黑人性爽| 亚洲欧洲精品天堂一级| 欧美日韩在线高清| 青青草原综合久久大伊人精品优势| 欧美大成色www永久网站婷| 久久久久国产精品无码免费看| 一区二区三区高清不卡| 欧美日韩一道本| 久久久久高清精品| 免费观看国产成人| 久久精品国产在热久久| 91精品国产综合久久男男| 国产www免费观看| 久久国产精品久久精品| 久久久久成人精品无码| 亚洲人永久免费| 夫妻性生活毛片| 日韩hd视频在线观看| 夜夜春很很躁夜夜躁| 欧美一二三四在线| 中文人妻一区二区三区| 欧美一区二区黄色| 国产精品免费在线视频| 亚洲美女又黄又爽在线观看| 国产精品成人69xxx免费视频| 亚洲精品在线不卡| 免费在线黄色片| 午夜精品一区二区三区在线视| 黄瓜视频在线免费观看| 久久全国免费视频| a天堂在线视频| 91精品视频播放| 三级欧美在线一区| 人禽交欧美网站免费| 岛国av在线一区| 欧美精品久久96人妻无码| 国产精品麻豆视频| 我要看一级黄色大片| 色老汉一区二区三区| 你懂得在线观看| 日本成人激情视频| 国产成人精品三级| 欧美韩国日本在线|