成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

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

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

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

現(xiàn)在開發(fā)前后端分離變得越來越流行了,后端只提供接口返回json格式的數(shù)據(jù),即使是錯誤信息也要以json格式來返回,然而目前無論是Laravel框架還是ThinkPHP框架,都只提供了返回json數(shù)據(jù)的方法,對異常的處理并不是以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方法里,我們根據(jù).env文件中的APP_DEBUG來判斷,如果是調(diào)試模式,我們還是按照默認方式來渲染錯誤,如果是非調(diào)試模式,我們就返回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()
 ]);
 }
}

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

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

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

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

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

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

首先我們看一下框架的report方法,代碼在(src/Illuminate/Foundation/Exceptions/Handler.php),我用紅框框起來的代碼就是調(diào)用棧信息,我們在重寫這個方法時只需要完全拷貝這個方法里的所有代碼到我們自定義的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()
 );
}

然后我們再重新請求一下接口再去查看錯誤日志的記錄,可以發(fā)現(xiàn)確實沒有記錄調(diào)用棧信息了,但是下面的信息還是不夠,我們沒法根據(jù)下面的信息判斷錯誤發(fā)生在哪一個文件和哪一行,如果能在記錄錯誤信息的時候同時記錄發(fā)生錯誤的文件和行就更好了,所以借著修改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()方法加上了文件和行數(shù),保存代碼再次訪問接口,查看錯誤日志文件我們可以看到發(fā)生錯誤的文件和行數(shù)已經(jīng)記錄下來了,有了這些信息基本我們就可以找到錯誤

截止到這里實現(xiàn)最初的需求我們的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()
 );
 }
}

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

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

php artisan make:exception ClientException

修改為構(gòu)造方法為如下代碼

namespace App\Exceptions;

use Exception;

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

接著我們繼續(xù)修改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 = '服務(wù)器錯誤';
 }
 
 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方法里把異常大概分為了兩大類,一大類就是客戶端異常,另一大類就是服務(wù)器異常,我們把服務(wù)器異常統(tǒng)一code為500,錯誤信息為服務(wù)器錯誤,將真實的錯誤信息記錄在了錯誤日志里,避免把服務(wù)器信息暴露給了客戶端。

現(xiàn)在我們來測試我們重寫異常的結(jié)果

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

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

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

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

但是真實的錯誤信息會記錄在錯誤日志里,我們?nèi)耘f可以通過錯誤日志來修改我們服務(wù)端的錯誤

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

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

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《如何重寫Laravel異常處理類詳解》,本文關(guān)鍵詞  如何,重寫,Laravel,異常,處理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《如何重寫Laravel異常處理類詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于如何重寫Laravel異常處理類詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    伊人影院蕉久552| 奇米色777欧美一区二区| 欧美国产中文高清| 国产欧美日韩精品一区二区免费| 岛国片免费观看| 日韩人妻无码一区二区三区| 日韩黄色a级片| 国产伦精品一区二区三区视频金莲| 成人黄色免费网站在线观看| 久久午夜电影网| 国产又爽又黄视频| 精品国模一区二区三区| 国产精品一线| 国产aⅴ爽av久久久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 日本熟妇一区二区三区| 久久精品国产亚洲一区二区| 污污的视频在线观看| 亚洲男人都懂的网站| 国产欧美日韩亚洲| 亚洲黄色小说网站| 夜先锋资源网| 国产精品sm| 欧美丰满少妇xxxxx做受| free性欧美1819hd| 一区二区精品在线| 亚洲精品一区二区三区新线路| 国产黄色片网站| 成人免费观看www在线| 91国内精品白嫩初高生| 国产免费人做人爱午夜视频| 国产又粗又黄又爽视频| 日韩av在线天堂网| 国产黄频在线观看| 91精品国产99久久久久久| 久久久久久亚洲av无码专区| 一区二区三区中文字幕电影| 91国内精品野花午夜精品| 欧美日韩激情在线观看| 无码人妻精品一区二区三区66| 不卡区在线中文字幕| 国精产品久拍自产在线网站| 男男做性免费视频网| 天海翼精品一区二区三区| 成人午夜av电影| 熟妇高潮一区二区高潮| 日韩成人中文电影| 中文字幕一区二区三区在线观看| 激情视频免费| 日韩成人综合网站| 亚洲人成网站在线播放2019| 91国产精品电影| 亚洲国产sm捆绑调教视频| 99视频精品免费视频| 日韩av资源| 国产精品美女久久久久久久| 中文在线网在线中文| 成人网6969conwww| 国产性做久久久久久| av中文字幕免费观看| 国产精品中文字幕日韩精品| 一区二区高清免费观看影视大全| www在线免费观看视频| 久久电影一区二区| 26uuu亚洲电影| 国产免费视频一区二区三区| 国产一级在线免费观看| 一级做a爱片久久| 人妻一区二区三区免费| 国产第一页在线视频| 在线观看成人网| 国产成人在线视频网站| 影音先锋男人资源在线观看| 久久免费一区| 国产美女高潮在线观看| 成人观看高清在线观看免费| 亚洲草久电影| 日韩成人一区二区三区在线观看| www..com国产| 中文字幕一区二区三区四区在线视频| 精品视频www| 毛片视频免费观看| 国产欧美一区二区三区另类精品| 成人美女视频在线看| 日韩成人综合| 91亚洲国产成人久久精品麻豆| 领导边摸边吃奶边做爽在线观看| 日韩av一区二区三区在线| 国产美女被遭强高潮免费网站| 区一区二区三区中文字幕| 国内精品久久久久国产盗摄免费观看完整版| 国产乱人伦真实精品视频| 综合久久成人| 国产成+人+日韩+欧美+亚洲| 九九**精品视频免费播放| 开心丁香婷婷深爱五月| 色偷偷www8888| 三年片观看免费观看大全视频下载| 四虎地址8848jia| 国产美女99p| 国产精品一级在线观看| 中文字幕久久久久| av在线免费网站| 免费在线观看羞羞视频| 国产中文字幕一区| 亚洲美女自拍偷拍| 久久蜜桃香蕉精品一区二区三区| 国产毛片视频网站| 日本19禁啪啪吃奶大尺度| 91伊人久久大香线蕉| 欧美精品一区二区久久婷婷| 7777精品久久久大香线蕉| 最近中文视频在线| 精品a在线观看| 一级一片免费看| 亚洲综合精品在线| 欧美成人手机在线视频| 夜夜操天天干| 免费在线成人av电影| 国产区高清在线| bdsmchinese医疗折磨| 国产精品呻吟| 老司机福利在线观看| 成人春色在线观看免费网站| 日韩成人免费观看| 国产女主播在线播放| 国产福利一区二区三区在线播放| 黑人狂躁日本妞一区二区三区| 精品美女被调教视频大全网站| 欧美日韩免费在线| 日韩字幕在线观看| 国产精品美女久久久久av爽李琼| 亚洲成人www| 日韩一区二区三区视频在线观看| 成人91免费视频| 亚洲高清av一区二区三区| 成人中文字幕电影| 男人操女人在线观看| 日本年轻的继坶中文字幕| 卡通动漫精品一区二区三区| 尤物yw午夜国产精品视频明星| 亚洲三区在线观看无套内射| 波多野结衣免费观看| 91在线看黄| 水蜜桃色314在线观看| 公交车上扒开嫩j挺进去| 精品久久久久一区二区三区| 成人在线观看www| 欧美视频精品在线| 深夜福利久久| 最近中文字幕mv免费高清电影| 国产成人av一区| 人妻互换一区二区激情偷拍| 日本成人中文字幕| 日韩在线视频观看| 亚洲999一在线观看www| 在线播放evaelfie极品| 欧洲精品久久久久毛片完整版| 欧美日韩亚洲不卡| 国产精品女人毛片| 天堂av电影在线观看| 精品国产一区二区三区日日嗨| 亚洲成人免费av| 麻豆国产一区二区| jizzjizzjizz亚洲| 91精品国产一区二区三区动漫| 日本精品一区二区三区在线观看视频| 四虎影视1304t| 国产精品视频第一区| 国产一区二区三区免费不卡| 污视频网站免费看| 国产精品久久久久久久久久小说| 日韩av一区二区三区美女毛片| av成人在线看| 伊人成年综合网| 波多野结衣在线一区| 久久艹这里只有精品| 亚洲欧美久久婷婷爱综合一区天堂| 2023国产精品久久久精品双| 亚洲五月激情网| 99在线精品免费视频九九视| 我的公把我弄高潮了视频| 免费h精品视频在线播放| 欧美日韩国产精品一卡| 综合国产在线| 欧美做爰性欧美大fennong| 最近中文字幕在线观看| 黄动漫在线免费观看| 亚洲一区二区影院| 自拍偷拍视频在线| 99re6热在线精品视频| 欧美另类69xxxx| 51精品视频一区二区三区| 亚洲欧美一区二区三| 91色视频在线导航| 日本jizz中国| 国产情侣一区二区| 综合精品久久| 美女扒开大腿让男人桶| 成人国产亚洲欧美成人综合网| 91国语精品自产拍| 久久9999久久免费精品国产| 精品中文一区| 国产精品久久91| 国产夫妻视频| 欧美一区二区三区视频在线| 成人福利视频在线| 欧美精品偷拍| 自拍视频一区二区三区| 欧美中文字幕一区二区三区亚洲| √天堂中文在线| 欧美精品一区二区三区国产精品| 91精品亚洲一区在线观看| 久久久久久久久91| 日日夜夜天天综合| av播放官网| 欧美色中文字幕| 午夜精品剧场| 欧美高清性hdvideosex| 欧美黑人视频一区| **性色生活片久久毛片| 亚洲国产天堂久久综合网| 99久久婷婷国产综合精品电影| wwwxx在线观看| 国产精选久久久久久| 色视频一区二区三区| 4444kk亚洲人成电影在线| 欧美高清在线视频| 欧美性猛交xxxx免费看久久久| 欧美另类videos| 亚洲性视频在线| 免费看的黄色欧美网站| 热re99久久精品国99热蜜月| 日韩欧美aaa| 91精品国产经典在线观看| 国产精品永久免费| 亚洲人体大胆视频| 国产成人精品电影久久久| 国产乱码精品一区二区三区av| 久久久久久久久久美女| 免费日本黄色网址| 美女av免费在线观看| 午夜在线观看视频网站| 亚洲激情亚洲| 小说区图片区图片区另类灬| 成人综合在线网站| 黄色成人在线观看网站| 国产精品久久久久久久久婷婷| 免费看一区二区三区| 丝袜美腿亚洲一区二区| 邪恶网站在线观看| 欧美a级在线| 亚洲一区二区三区成人| 91精产国品一二三| 国产精品一香蕉国产线看观看| 蜜桃网站成人| 成人在线观看网址| 亚洲最新av网站| 亚洲第一区第二区| 国产精品一区二区电影| 91精品电影| 日韩电影第一页| 免费男女羞羞的视频网站在线观看| 国产高清中文字幕在线| 国产69精品一区二区亚洲孕妇| 亚洲一区欧美在线| 刘亦菲毛片一区二区三区| 日本不卡高清视频一区| 成人免费视频caoporn| 天天好比中文综合网| 中文产幕区在线观看| 国产美女诱惑一区二区| 影音先锋男人的网站| 亚洲午夜小视频| 影音先锋在线中文| 精品视频在线一区二区| 亚洲女人天堂在线| 四虎在线免费看| 精品国产欧美一区二区五十路| 欧美日韩一级黄| 欧美在线观看天堂一区二区三区| av亚洲精华国产精华精华| 日本一区二区在线视频| 在线视频亚洲欧美中文| 色婷婷久久av| 综合精品久久久| 99综合在线| 亚洲精品美腿丝袜| 91精品国产综合久久久久久豆腐| 欧美亚洲愉拍一区二区| 一本一本久久a久久精品综合麻豆| 亚洲午夜激情网站| 国产精品成人一区二区网站软件| 欧美97人人模人人爽人人喊视频| 国自产拍偷拍精品啪啪一区二区| 国产成人愉拍精品久久| 欧美一区在线观看视频| 黑人精品一区二区| 欧美性猛交xxxx富婆弯腰| 26uuu日韩精品一区二区| 四虎精品永久在线| 青青操免费在线视频| 国产欧美高清视频在线| 久久久久久91精品色婷婷| 天天添天天操| 中文字幕天堂在线| 中文字幕一区二区三区四区免费看| 久久午夜鲁丝片| 日韩欧美中文在线观看| 午夜免费高清视频| 成人动漫精品一区二区| 欧美男男gaytwinkfreevideos| 毛片基地在线观看| 性色视频在线观看| 国产精品色婷婷在线观看| 亚洲男人天堂2017| 欧美aaaaaaaaaaaa| 成人精品影视| 一区二区日韩视频| 欧美四级电影在线观看| 久久久久久久国产精品影院| 99久久免费观看| 91国产免费观看| 欧美日韩精品电影| 白嫩少妇丰满一区二区| 天天做天天干天天操| 91夜夜蜜桃臀一区二区三区| 成人午夜视频一区二区播放|