更加符合语义化

异常类往往都有自己的名字,在函数调用层面,即使不进入函数内部也能够通过异常名来判断调用函数会伴有哪些异常,如果函数没有异常,返回的是 false 或 true ,这会让函数的调用者非常头痛,因为你永远不知道这个函数调用什么时候是异常的,只能通过返回值判断,一个函数如果有多种异常情况,通过返回值判断就会在调用层面生成多个 if,如果使用了异常类,调用层能够轻松的分别 catch 不同的异常来进行处理。

// 调用方无法从外部得知时哪里出了问题,因为只返回了 false

function checkoutOrder($orderNumber){

$orderModel = OrderModel::query()->where('order_number',$orderNumber)->first();

if(!$orderModel){

return false;

}

$payResut = PayService::pay($orderModel);

if(!$payResut){

return false;

}

}

为每种程序异常命名:

function checkoutOrder($orderNumber){

$orderModel = OrderModel::query()->where('order_number',$orderNumber)->first();

if(!$orderModel){

throw new OrderNotFoundException($orderNumber);

}

$payResut = PayService::pay($orderModel);

if(!$payResut){

throw new PaymentException(); // 这个异常应该上面的 PayService 中抛出,为了更清晰就写在这

}

}

// 调用

try{

checkoutOrder('ORDER00001');

}catch(OrderNotFoundException $e){

return response('订单不存在:'.$e->getMessage(),404);

}catch(PaymentException $e){

return response('支付失败:'.$e->getMessage(),500);

}

在 Laravel 中使用异常类

Laravel 异常处理流程:

注:如果在控制器中 catch 最底层的 \Exception ,异常就不会走到 Handler 里面,未被 catch 掉的 \Exception 都会记录在 storage/logs/laravel.log 中,所以在控制器中 catch 异常要考虑清楚,否则可能在日志文件中查询不到错误原因。

使用 Handler 做项目错误告警

在 app/Exceptions/Handler.php 中根据异常名、紧急程度调用第三方通知工具(钉钉、邮件等)通知项目错误。

public function report(Exception $exception){

if ($this->shouldntReport($exception)) {

return;

}

// 如果异常类中存在 report 方法,就使用自身的

if (method_exists($exception, 'report')) {

return $exception->report();

}

$msg = "系统异常:" . $exception->getMessage();

$msg .= "\n文件:" . $exception->getFile();

$msg .= "\n行号:" . $exception->getLine();

$msg .= "\n参数:" . json_encode(['form_params' => request()->all()]);

DingService::sendWarning($msg);

parent::report($exception);

}

在 render 方法根据异常名返回不同的客户端响应:public function render($request, Exception $exception)

{

if ($exception instanceof OrderException) {

return $this->handleOrderException($exception, $request);

}

if ($exception instanceof PaymentException) {

return $this->handlePaymentException($exception, $request);

}

return parent::render($request, $exception);

}

PHP项目异常类该如何设计,浅谈 PHP 中异常类的使用相关推荐

  1. java final 修改_“无法改变的设计”——浅谈Java中的final关键字

    在Java中,final关键字可以用来修饰类.变量(包括成员变量和局部变量).方法,下面从这三个方面分别说明. final方法 当一个方法被final修饰时,表明这个方法不能被子类重写. 下面程序试图 ...

  2. OOD面向对象设计浅谈

    來源:http://dev.csdn.net/htmls/59/59377.html OOD面向对象设计浅谈 前言 OOD指面向对象设计,在软件设计生命周期中发生于OOA之后期或者之后,OOA与OOD ...

  3. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  4. 激活函数设计vhdl_浅谈神经网络中激活函数的设计

    激活函数是神经网络中非线性的来源,因为如果去掉这些函数,那么整个网络就只剩下线性运算,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型. 那么,常见的激活函数有哪些呢?或者说,激活函数的 ...

  5. 浅谈String和StringBuffer类:

    浅谈String和StringBuffer类: 如果有错误的地方,请多多提出! 内存分配: String(固定字符串): String类对象一旦创建,内容无法修改. String a="3& ...

  6. python读取json数据格式问题_浅谈Python中的异常和JSON读写数据的实现

    异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except .. ...

  7. Lily-w131 wifi模块天线分集硬件设计浅谈

    wifi模块天线分集 Lily-w131 wifi模块天线分集硬件设计浅谈 引用百度百科天线分集的概念.天线分集是使用两个接收信道,它们受到的衰落影响是不相关的:两者在某一时刻同时经受某一深衰落点影响 ...

  8. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

  9. 浅谈C#中的延“.NET研究”迟加载(2)——善用virtual

    之前的文章"浅谈C#中的延迟加载(1)--善用委托"中介绍了三层结构中在Model层对实体类的属性实现延迟加载的方法,该方法利用C#中的委托来实现,最后虽然延迟加载的目的得以实现, ...

最新文章

  1. Rxjava与Retrofit的使用
  2. exchange2007配置发送、接收附件大小
  3. HDU1525 Euclid's Game 【欧几里得博弈】
  4. LVS(6)——NAT准备工作
  5. SAP Spartacus PagelayoutComponent里的section和slot
  6. 如何在 Web Forms 中引入依赖注入机制
  7. 深度学习(六十六)生成模型、最大化似然、KL散度
  8. Android 音频开发(二) 采集一帧音频数据
  9. 矩池云通过本地端口转发方式登陆VNC
  10. 微型计算机控制系统常用报警方式,微型计算机控制技术复习资料.docx
  11. C++STL——vector初探
  12. 配置apache密码认证
  13. 排序算法之二路归并排序
  14. 三星PM981(a)硬盘安装黑苹果(第五版)
  15. 筑业单机版建材管理软件
  16. 双闭环矢量控制的电压型PWM整流器参数整定
  17. (转)不看绝对后悔的Linux三剑客之awk实战精讲
  18. python opencv 修改局部区域像素值
  19. python高频词汇表大全_利用python统计word文档高频词汇
  20. 异常-Exception

热门文章

  1. 计算机自动关闭硬盘,你遇到过电脑硬盘自动关闭的问题吗?
  2. 计算机应用技术概括,计算机应用技术学科各学科方向简介
  3. Java 算法 开灯游戏
  4. java 蓝桥杯 Huffuman树
  5. 使用kafka解决zookeeper is not a recognized option when executing kafka-console-consumer.sh报错
  6. Mac neo4j忘记密码,不删除数据处理方法
  7. 解决使用pip无法安装rasa与无限依赖告警:INFO: This is taking longer than usual. You might need to provide the....
  8. 解决安装MarkupSafe安装 from setuptools import Feature 报错ImportError: cannot import name ‘Feature‘
  9. 使用英文做LDA建模
  10. 计算发送延时与传播延迟_Kafka科普系列 | 轻松理解Kafka中的延时操作