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

主頁(yè) > 知識(shí)庫(kù) > 如何重寫(xiě)Laravel異常處理類(lèi)詳解

如何重寫(xiě)Laravel異常處理類(lèi)詳解

熱門(mén)標(biāo)簽:gps 地圖標(biāo)注軟件 招標(biāo)自動(dòng)語(yǔ)音外呼系統(tǒng) 地圖標(biāo)注視頻廣告入駐 OMG地圖標(biāo)注app 400電話(huà)鄭州申請(qǐng) 電銷(xiāo)機(jī)器人便宜的有嗎 中原區(qū)電話(huà)機(jī)器人價(jià)格 ai電話(huà)機(jī)器人加盟代理 黔江400電話(huà)如何辦理

現(xiàn)在開(kāi)發(fā)前后端分離變得越來(lái)越流行了,后端只提供接口返回json格式的數(shù)據(jù),即使是錯(cuò)誤信息也要以json格式來(lái)返回,然而目前無(wú)論是Laravel框架還是ThinkPHP框架,都只提供了返回json數(shù)據(jù)的方法,對(duì)異常的處理并不是以json格式來(lái)返回給我們,所以這里就需要我們自己來(lái)改寫(xiě)。

首先我們?cè)赼pp/Exceptions目錄新建一個(gè)ExceptionHandler.php繼承自Handler.php

namespace App\Exceptions;


class ExceptionHandler extends Handler
{

}

然后我們?cè)赽ootstrap/app.php中,使用我們自定義的異常處理類(lèi)ExceptionHandler替換掉默認(rèn)的Handler類(lèi)

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

接下來(lái)我們就開(kāi)始重寫(xiě)渲染方法

在render方法里,我們根據(jù).env文件中的APP_DEBUG來(lái)判斷,如果是調(diào)試模式,我們還是按照默認(rèn)方式來(lái)渲染錯(cuò)誤,如果是非調(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來(lái)測(cè)試一下,然后我們故意把代碼寫(xiě)錯(cuò),通過(guò)postman或?yàn)g覽器來(lái)訪問(wèn)接口

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

在APP_DEBUG=true的情況下還仍然是默認(rèn)渲染,方便我們查找錯(cuò)誤排錯(cuò)

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

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

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

首先我們看一下框架的report方法,代碼在(src/Illuminate/Foundation/Exceptions/Handler.php),我用紅框框起來(lái)的代碼就是調(diào)用棧信息,我們?cè)谥貙?xiě)這個(gè)方法時(shí)只需要完全拷貝這個(gè)方法里的所有代碼到我們自定義的report方法里,然后把紅框里的代碼去掉即可

我們?cè)谖覀冏远x的異常處理類(lèi)ExceptionHandler.php中重寫(xiě)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()
 );
}

然后我們?cè)僦匦抡?qǐng)求一下接口再去查看錯(cuò)誤日志的記錄,可以發(fā)現(xiàn)確實(shí)沒(méi)有記錄調(diào)用棧信息了,但是下面的信息還是不夠,我們沒(méi)法根據(jù)下面的信息判斷錯(cuò)誤發(fā)生在哪一個(gè)文件和哪一行,如果能在記錄錯(cuò)誤信息的時(shí)候同時(shí)記錄發(fā)生錯(cuò)誤的文件和行就更好了,所以借著修改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()
 );
}

在代碼里我通過(guò)exception的getFile()、getLine()方法加上了文件和行數(shù),保存代碼再次訪問(wèn)接口,查看錯(cuò)誤日志文件我們可以看到發(fā)生錯(cuò)誤的文件和行數(shù)已經(jīng)記錄下來(lái)了,有了這些信息基本我們就可以找到錯(cuò)誤

截止到這里實(shí)現(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ù)器端的錯(cuò)誤信息以JSON格式返回給客戶(hù)端了,這是不允許的,我們應(yīng)該只把一些客戶(hù)端錯(cuò)誤返回給客戶(hù)端,比如密碼不足六位、身份證不合法諸如此類(lèi),而服務(wù)端出現(xiàn)錯(cuò)誤時(shí)我們只返回給客戶(hù)端一個(gè)模糊的信息即可,比如“服務(wù)器錯(cuò)誤”,把真實(shí)的服務(wù)器錯(cuò)誤信息記錄在日志里面方便開(kāi)發(fā)人員排查錯(cuò)誤

所以我們需要定義一個(gè)客戶(hù)端異常專(zhuān)門(mén)用戶(hù)返回客戶(hù)端錯(cuò)誤,使用如下命令在app/Exceptions目錄下生成一個(gè)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 錯(cuò)誤碼
 */
 protected $code;
 /**
 * @var string 錯(cuò)誤信息
 */
 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ù)器錯(cuò)誤';
 }
 
 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()
 );
 }
}

對(duì)于上面的修改做一下說(shuō)明,laravel的$dontReport屬性的異常類(lèi)都不會(huì)被上報(bào),因?yàn)榭蛻?hù)端錯(cuò)誤信息我們不需要記錄,所以將其添加到$dontReport屬性里,并且在render方法里把異常大概分為了兩大類(lèi),一大類(lèi)就是客戶(hù)端異常,另一大類(lèi)就是服務(wù)器異常,我們把服務(wù)器異常統(tǒng)一code為500,錯(cuò)誤信息為服務(wù)器錯(cuò)誤,將真實(shí)的錯(cuò)誤信息記錄在了錯(cuò)誤日志里,避免把服務(wù)器信息暴露給了客戶(hù)端。

現(xiàn)在我們來(lái)測(cè)試我們重寫(xiě)異常的結(jié)果

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

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

對(duì)于服務(wù)器端的錯(cuò)誤,如少些了分號(hào),客戶(hù)端就只會(huì)知道服務(wù)器的某個(gè)接口出了問(wèn)題,但是不清楚具體問(wèn)題是什么

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

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

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

至此,我們的重寫(xiě)Laravel異常處理類(lèi)就算完成啦,希望對(duì)正在準(zhǔn)備使用Laravel做前后端分離項(xiàng)目的你有所幫助。

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

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

標(biāo)簽:那曲 濟(jì)源 哈密 池州 孝感 阿里 北京 日照

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《如何重寫(xiě)Laravel異常處理類(lèi)詳解》,本文關(guān)鍵詞  如何,重寫(xiě),Laravel,異常,處理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《如何重寫(xiě)Laravel異常處理類(lèi)詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于如何重寫(xiě)Laravel異常處理類(lèi)詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲黄色免费网站| 欧美日韩一卡二卡三卡| 久久综合精品国产一区二区三区| 国产精品久久久久久久久免费相片 | 国产一区二区h| 国产**成人网毛片九色 | 4438x亚洲最大成人网| 亚洲线精品一区二区三区八戒| 国产亚洲精品aa| 欧美激情自拍偷拍| 亚洲精品videosex极品| 丝袜脚交一区二区| 粉嫩aⅴ一区二区三区四区| 福利91精品一区二区三区| 成人免费不卡视频| 国产日产欧美一区| 成人一级片在线观看| 国产精品一级黄| 欧美性色aⅴ视频一区日韩精品| 欧美午夜精品一区二区三区| 波多野结衣中文字幕一区| 欧美一区二区在线免费观看| 亚洲国产精品av| 美女视频网站久久| 欧美无砖专区一中文字| 亚洲成av人影院| 日韩精品一卡二卡三卡四卡无卡| 美洲天堂一区二卡三卡四卡视频| 国产精品亚洲第一区在线暖暖韩国 | 婷婷开心激情综合| 高清av一区二区| 国产日产欧美一区| 亚洲国产成人tv| 91丝袜美女网| 亚洲视频1区2区| 99视频在线精品| 综合欧美一区二区三区| 成人福利视频网站| 亚洲欧洲美洲综合色网| 国产不卡视频一区| 国产女同互慰高潮91漫画| 狠狠色丁香九九婷婷综合五月| 日韩一区二区在线播放| 国模娜娜一区二区三区| 国产情人综合久久777777| 国产乱码精品一区二区三区忘忧草 | 色综合天天综合网天天狠天天| 欧美国产欧美亚州国产日韩mv天天看完整 | 国产综合色精品一区二区三区| 精品国产乱码91久久久久久网站| 久久99久久99| ㊣最新国产の精品bt伙计久久| 色婷婷av一区二区三区软件 | 亚洲激情图片小说视频| 欧美专区亚洲专区| 韩国欧美国产1区| 亚洲男人电影天堂| 欧美成人精品二区三区99精品| 99久久精品国产网站| 蜜桃视频一区二区| 亚洲一级不卡视频| 国产精品素人视频| 日韩欧美一区在线| 一本色道亚洲精品aⅴ| 国产在线不卡一卡二卡三卡四卡| 亚洲免费观看高清完整版在线| 精品蜜桃在线看| 9191久久久久久久久久久| 一本色道**综合亚洲精品蜜桃冫 | 国产美女娇喘av呻吟久久| 亚洲午夜电影在线| 亚洲男女毛片无遮挡| 国产精品久久久久久久久动漫| 久久综合网色—综合色88| 欧美一区二区三区性视频| 欧美日韩国产123区| 欧美三级中文字幕| 91精品免费在线| 日韩欧美国产一二三区| 日韩片之四级片| 久久蜜臀中文字幕| 亚洲日本在线天堂| 亚洲亚洲精品在线观看| 亚洲成人动漫在线免费观看| 秋霞av亚洲一区二区三| 激情综合色综合久久综合| 国产福利不卡视频| 91福利在线导航| 欧美精品vⅰdeose4hd| 欧美mv日韩mv国产网站app| 国产精品入口麻豆九色| 亚洲一区二区不卡免费| 韩国女主播成人在线| 成人免费视频国产在线观看| 欧美日韩精品高清| 中文字幕一区二区三区不卡在线| 日韩电影免费在线观看网站| 秋霞午夜av一区二区三区| 国产在线一区观看| 91久久一区二区| 中文字幕乱码久久午夜不卡 | 中文字幕一区二区日韩精品绯色| 日韩美女视频19| 日韩av电影天堂| 美日韩一区二区| 亚洲一区二区三区在线播放| 一区二区三区在线播| 日韩一区在线免费观看| 亚洲人成网站色在线观看| 亚洲成人精品一区| 成人免费毛片片v| 91精品国产综合久久香蕉麻豆| 国产成人av电影在线| 日韩国产一二三区| 午夜精品久久久久久久99水蜜桃| 国产精品福利av| 亚洲精品欧美激情| 久久精品国产一区二区三区免费看| caoporn国产精品| 精品奇米国产一区二区三区| 丝袜美腿一区二区三区| 国模少妇一区二区三区| 91精品国产综合久久福利| 91搞黄在线观看| 国产精品久久久久永久免费观看| 一区二区三区电影在线播| 国产99久久久精品| 另类小说色综合网站| 精品婷婷伊人一区三区三| 欧美tickling挠脚心丨vk| 日韩高清中文字幕一区| 欧美精品电影在线播放| 日日夜夜一区二区| 7777精品伊人久久久大香线蕉经典版下载| 日韩激情视频在线观看| 蜜臀久久99精品久久久画质超高清 | 一区二区三区美女| 欧美精品电影在线播放| 午夜成人免费视频| 欧美一区二区精品在线| 无码av中文一区二区三区桃花岛| 欧美日韩亚洲综合在线| 日韩 欧美一区二区三区| 日韩一区二区三区四区| 麻豆中文一区二区| 欧美精品一区二区三区在线| 国产乱一区二区| 亚洲欧美激情小说另类| 亚洲黄一区二区三区| 五月激情综合网| 中文字幕制服丝袜成人av| 久久综合网色—综合色88| 6080yy午夜一二三区久久| 精品美女在线观看| 国产精品成人一区二区艾草| 国产日韩欧美一区二区三区综合| 中文字幕第一区二区| 国产精品每日更新在线播放网址| 国产日韩精品视频一区| 国产精品天干天干在线综合| 亚洲男人的天堂在线aⅴ视频 | 色域天天综合网| 欧美精品国产精品| 亚洲精品国产高清久久伦理二区| 人人超碰91尤物精品国产| 99久久精品国产一区二区三区 | 欧美成人vr18sexvr| 欧美日韩日日夜夜| 国产精品久久二区二区| 99久久er热在这里只有精品15| 久久免费看少妇高潮| 奇米一区二区三区| 久久精品国产精品亚洲综合| 99riav一区二区三区| 精品少妇一区二区三区在线播放| 亚洲精品在线观看网站| 日韩理论片中文av| 日韩电影在线看| 在线播放视频一区| 欧美精彩视频一区二区三区| 三级欧美在线一区| 91浏览器入口在线观看| 中文字幕一区二区5566日韩| 亚洲精品第1页| 精品亚洲国内自在自线福利| 日韩电影在线一区二区| 视频一区欧美日韩| 国产综合久久久久久久久久久久| 日日摸夜夜添夜夜添亚洲女人| 一区二区理论电影在线观看| 欧美高清一级片在线观看| 一区二区激情视频| 麻豆成人久久精品二区三区小说| 精品影院一区二区久久久| 99九九99九九九视频精品| 制服丝袜中文字幕一区| 91视频.com| 国产一区二区网址| 国产精品18久久久久久久网站| 亚洲视频免费在线|