一、前言

  做一件事,不仅要知其然,更要知其所以然。大部分的人都生活在别人设计的世界里,不是没有能力去更深一层,更进一步,而是因为自己懒得去思考。也许自己现在要做的就是:不要让自己舒服吧。

二、正题

1. 定义异常

class StorageException extends MaterialException
{
/**
* @var integer ERROR_CODE 错误代码基数
*/
const ERROR_CODE = 12; // 这个有用,后面会讲到 /**
* @var string MODULE 模块名称
*/
const MODULE = 'storage';// 这个有用,后面会讲到
/** * @var boolean $displayable 是否展示错误信息给前端标记 */ protected $displayable = false; /** * 不上报到sentry的错误码 * * @var array */ protected $dontReport = [12, 15]; /** * 用户自定义异常代码 */ const RECORD_NOT_EXISTS = [10, '资料记录不存在']; const DB_ERROR = [11, '更新数据库出现异常']; const DIR_EXISTS = [12, '目录已存在'];
}

2. 抛出异常

if (empty($announcement)) {
list($code, $message) = AnnouncementException::ANNOUNCEMENT_DOES_NOT_EXISTS;
throw new AnnouncementException($code, $message);
}

3. laravel 捕获异常,怎么捕获的暂时不得而知,等我修炼修炼再来补充。

4. 异常进入到 Handler.php 中去class Handler extends BaseHandler

{
/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [ ]; // 不报告的异常 /**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $e
* @return void
*/
public function report(Exception $e)
{
parent::report($e); // 将异常上报,具体的操作看下面
} /**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
    $message = $e->getMessage();
    $code = $e->getCode();
    $displayable = false; // 异常的具体信息是否可显示给用户
    $module = '';
    $data = [];
$result = [
'code' => $code,
'message' => $message,
'displayable' => $displayable,
'module' => $module,
'data' => $data
];
\Log::error("exception response", $result); // 记录错误到日志中
$response = new Response($result, 200); return $response;
}
}

5. report函数

class BaseHandler extends ExceptionHandler
{
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
      
if (app()->environment('production') && $this->shouldReport($exception)) { // app()->environment('production')这个是什么不知道 // shouldReport判断是不是应该报告
if ($exception instanceof SentryException) { // sentry错误就对senrty错误进行处理
$this->dispatchException($exception);
} else {
app('sentry')->captureException($exception); // 非sentry错误将会捕捉
}
} parent::report($exception);
// @codeCoverageIgnoreStart
}
// @codeCoverageIgnoreEnd /**
* Method dispatchException
* 构造 sentry 日志信息
*
* @param Reportable $exception
*/
private function dispatchException(Reportable $exception)
{
$httpInstance = HttpInputInfo::getInstance();
$traceId = $httpInstance->getTraceId();
$reportable = $exception->getReportable(); if (!$reportable) {
return false;
} app('sentry')->captureException($exception, [
'level' => $exception->getLevelName($exception->getLevel()),
'tags' => [
'module' => $exception->getModule(), // 上面的module
'code' => $exception->getCode(), // 上面的code
'trace_id' => $traceId,
],
'extra' => $exception->getExtra(),
]);
}
}

6. render函数

  render函数主要是把错误以httpResponse的形式返回

laravel 异常深度解析的更多相关文章

  1. (转载)(收藏)OceanBase深度解析

    一.OceanBase不需要高可靠服务器和高端存储 OceanBase是关系型数据库,包含内核+OceanBase云平台(OCP).与传统关系型数据库相比,最大的不同点, 是OceanBase是分布式 ...

  2. 深度解析Java8 – AbstractQueuedSynchronizer的实现分析(上)

    本文首发在infoQ :www.infoq.com/cn/articles/jdk1.8-abstractqueuedsynchronizer 前言: Java中的FutureTask作为可异步执行任 ...

  3. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  4. 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析

    在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...

  5. 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)

    在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...

  6. 蓝鲸DevOps深度解析系列(2):蓝盾流水线初体验

    关注嘉为科技,获取运维新知 前面一篇文章<蓝鲸DevOps深度解析系列(1):蓝盾平台总览>,我们总览了蓝鲸DevOps平台的背景.应用场景.特点和能力: ​ 接下来我们继续解析蓝盾平台的 ...

  7. laravel源码解析

    本专栏系列文章已经收录到 GitBooklaravel源码解析 Laravel Passport——OAuth2 API 认证系统源码解析(下)laravel源码解析 Laravel Passport ...

  8. Java 8 Optional 类深度解析

    Java 8 Optional 类深度解析 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只 ...

  9. 《SEO深度解析——全面挖掘搜索引擎优化的核心秘密》

    <SEO深度解析——全面挖掘搜索引擎优化的核心秘密> 基本信息 作者: 痞子瑞 出版社:电子工业出版社 ISBN:9787121224041 上架时间:2014-2-28 出版日期:201 ...

随机推荐

  1. Linux(CentOS)下同时启动两个tomcat

    问题背景:在配置nginx时,配置了两个tomcat,tomcat01和tomcat02,改了tomcat02中server.xml的端口,可是还是启动不起来. 解决方法: 一.编辑环境变量: 1 v ...

  2. LWIP裸机环境下实现TCP与UDP通讯(转)

    源: LWIP裸机环境下实现TCP与UDP通讯

  3. UVA756 Biorhythms

    UVA756 Biorhythms crt crt裸题 因为模数已知所以有些值能直接求 #include<iostream> #include<cstdio> using na ...

  4. 根据wsdl,axis2工具生成客户端代码

    根据wsdl,axis2工具生成客户端代码 步骤: 1,下载axis2版本http://axis.apache.org/axis2/java/core/download.html 2,下载完成后解压, ...

  5. 怎么解决深入学习PHP的瓶颈

    PHP给学习者的感觉是:初学的时候很容易,但是学了2-3年,就深刻感觉遇到了瓶颈,很难深入,放弃又可惜.所谓"鸡肋,食之无味弃之可惜"的感觉很是贴切. 经常会有这种感觉:不学,看似 ...

  6. ArcThemALL!5.1:解压、脱壳、压缩样样精通

    原文链接:http://www.ithome.com/html/soft/57033.htm ArcThemALL!软件主要功能: 1.支持压缩和解压功能,支持常用的7z.zip.cab.iso.ra ...

  7. 20145309李昊《网络对抗技术》实验9 web安全基础实践

    本实验在同学帮助下完成 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前 ...

  8. 20145314郑凯杰《网络对抗技术》实验8 WEB基础实践

    20145314郑凯杰<网络对抗技术>实验8 WEB基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...

  9. IDEA 插件-码云

    插件安装 最新插件版本: 2018.3.1.(2019-01-10 发布)注意:码云 IDEA 插件已由 gitosc 更名为 gitee.新版插件 gitee 菜单已经和 git 菜单合并 通过「插 ...

  10. SRLTE,SGLTE,SVLTE,CSFB,VoLTE的区别【转】

    本文转载自:https://blog.csdn.net/dangbochang/article/details/43851979 SRLTE——Single Radio LTE,俗称单待LTE. SG ...