2019年8月23日10:56:31

php很多开发不习惯使用异常处理,因为web开发,重在于快速开发,易用性,高性能,不强调程序健壮性

php的异常使用其实不是太完善,易用性也差点,当然这个对比其他语言来说

比较标准的做法就是先划分错误类型,分别针对错误类型制订处理方案和机制

比如业务逻辑级别错误,系统级别错误,致命错误等,针对不同级别错误,处理错误,增强代码的健壮性和访问友好性

class LogicException extends Exception{
//重定义构造器使第一个参数 message 变为必须被指定的属性
public function __construct($message, $code=0){
//可以在这里定义一些自己的代码
//建议同时调用 parent::construct()来检查所有的变量是否已被赋值
parent::__construct($message, $code);
}
public function __toString() {
//重写父类方法,自定义字符串输出的样式
return __CLASS__.":[".$this->code."]:".$this->message."<br>";
}
public function customFunction() {
//为这个异常自定义一个处理方法
echo "按自定义的方法处理出现的这个类型的异常<br>";
}
}

在最终错误返回的时候,针对具体错误类型做处理

Controller

 public function test(Request $Request) {
try { return response()->json(['code' => 200, 'msg' => '操作成功', 'data' => $data]);
} catch (\Exception $e) {
dealErr($e); }
function dealErr(\Exception $e) {

    if ($e instanceof LogicException) {

    } elseif ($e instanceof \Exception) {

    } else {
throw new \Exception('未知错误异常');
}
//获取请求参数
request()->all();
//写入日志
Log::info();
//返回信息
return response()->json(['code' => 400, 'msg' => $e->getMessage(), 'error' => formaErr($e)]);
}

下面是一个比较常用的demo

OrderController

public function getSonSaleOrderPay(Request $Request) {

        try {
$page = parameterCheck($Request->page, 'int', 1);
$pageSize = parameterCheck($Request->page_size, 'int', 15); $parent_order_key = parameterCheck($Request->parent_order_key, 'string', ''); $data = SaleParentOrderService::getSonOrderPay(parent::$shop_id, $parent_order_key, $page, $pageSize); return response()->json(['code' => 200, 'msg' => '操作成功', 'data' => $data]);
} catch (\Exception $e) {
      return response()->json(['code' => 400, 'msg' => $e->getMessage(), 'error' => formaErr($e)]);
 } }
SaleParentOrderService
 public static function getSonOrderPay(int $shop_id, string $parent_order_key, int $page = 1, int $pageSize = 15) {
try {
$SaleOrder = SaleOrder::where('is_delete', 10)->where('shop_id', $shop_id)->where('parent_order_key', $parent_order_key)->where('order_category', 20)->first();
if (empty($SaleOrder)) {
throw new \Exception('父订单号错误or订单数据被删除');
} $SaleOrderArray = SaleOrder::where('is_delete', 10)->where('shop_id', $shop_id)->where('parent_order_key', $parent_order_key)->where('order_category', 20)->get(); if (empty($SaleOrderArray)) {
return ['total' => 0, 'list' => []];
}
} catch (\Exception $e) {
throw $e;
}
}
    //格式化错误信息,方便输出
function formaErr(\Exception $e) {
// if ($e instanceof \Exception == false) {
// throw new \Exception('数据类型错误');
// }
$msg['File'] = $e->getFile();
$msg['Line'] = $e->getLine();
$msg['Msg'] = $e->getMessage();
$msg['Trace'] = $e->getTraceAsString(); return $msg;
}

注意这 是自己 throw 不然laravel会抛出就会返回不友好,特别是get请求的时候,

我个人是希望php引入java   throws,这样在多层级别代码的时候,可以减少很多不必要的逻辑代码的编写,直接往上层扔,方便易用

public static void function() throws NumberFormatException{
}

关于多层嵌套的try catch finally任何捕捉异常的方法

php在处理多层嵌套的时候回多余两层处理的时候,catch不能直接捕捉深层的跑出的异常只能 finally处理,但是有时候在多层抛出的异常是作为消息提示,getMessage方法的信息

处理方法也很简单因为抛出只能是上层异常对象才能处理,只需要在下层吧异常信息打包重新发给上一层就可以捕捉了

   try {

        } catch (\Exception $e) {
// throw $e;
throw new \Exception($e->getMessage());
}

有一点蛋疼但是有时候也没办法,这样多层嵌套的时候依然可以捕捉到具体抛出的错误信息

php异常处理小总结的更多相关文章

  1. C++异常处理小例

      学习程序的好方法是阅读代码和改进代码.下面的程例来自<An Overview of the C++ Programming Language>(5.1 异常和错误处理)程序用途:使用C ...

  2. python学习之----异常处理小示例

    网络是十分复杂的.网页数据格式不友好,网站服务器宕机,目标数据的标签找不到,都 是很麻烦的事情.网络数据采集最痛苦的遭遇之一,就是爬虫运行的时候你洗洗睡了,梦 想着明天一早数据就都会采集好放在数据库里 ...

  3. 2.scala控制结构、函数、异常处理

    2.scala控制结构.函数.异常处理---小书匠,在线编辑器,MARKDOWN,Evernote,文件版本 a:focus { outline: thin dotted #333; outline: ...

  4. [转]小D课堂 - 零基础入门SpringBoot2.X到实战_汇总

    原文地址:https://www.cnblogs.com/wangjunwei/p/11392825.html 第1节零基础快速入门SpringBoot2.0 小D课堂 - 零基础入门SpringBo ...

  5. 小D课堂 - 零基础入门SpringBoot2.X到实战_汇总

    第1节零基础快速入门SpringBoot2.0 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_1.SpringBoot2.x课程介绍和高手系 ...

  6. 爬虫请求库——selenium

    selenium模块 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题.selenium的缺点是效率会变得很慢. sel ...

  7. 爬虫-selenium 模块-02

    目录 selenium 模块 chromedriver 浏览器驱动下载与存放 PhantomJS 无界面浏览器 标签元素查找方法 xpath 格式用法 获取标签属性 等待元素被加载 元素交互操作 点击 ...

  8. python使用笔记17--异常处理

    什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Pyth ...

  9. SpringBoot小技巧:统一异常处理

    SpringBoot小技巧:统一异常处理 情景描述 对于接口的定义,我们通常会有一个固定的格式,比如: 但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格 ...

随机推荐

  1. BZOJ5509: [Tjoi2019]甲苯先生的滚榜

    题解 开n个平衡树对每个AC数维护罚时,然后不同AC数用树状数组维护即可. 其实挺好写的...就是评测的时候评的巨久... #include <bits/stdc++.h> using n ...

  2. DT系统开发之-在线询盘信息的调取实现

    调用标签 <!--{tag("table=message&condition=status=3 and typeid=1&areaid=$cityid&cati ...

  3. Spring Cloud 之 Hystrix 知识点:隔离、熔断、降级

    Hystrix 是隔离.熔断以及降级的一个框架. Hystrix 的隔离: Hystrix 会搞很多个小小的线程池,比如订单服务请求库存服务是一个线程池,请求仓储服务是一个线程池,请求积分服务是一个线 ...

  4. 编程语言和python介绍, 变量,小整数池,垃圾回收机制

    1.编程语言的发展史 计算机是基于电工作(基于高.低电平)1010010101011 1.机器语言 优点:执行速度够快 缺点:开发效率非常低 2.汇编语言(通过英文字符组成) 优点:执行效率相较于机器 ...

  5. You Can Customize Synthesized Instance Variable Names @property

    As mentioned earlier, the default behavior for a writeable property is to use an instance variable c ...

  6. podium micro-frontends 简单试用

    以下是一个简单的podium 试用,包含了layout 以及podlets,使用docker 运行 podium 主要包含了两大部分 podlets 片段服务 layouts 片段组合服务 环境准备 ...

  7. ABP 05 创建Model 以及 相应的增删改查

    在core层 添加一个model,如图 2.在 EntityFrameworkCore 层的 DbContext 中添加 Menu 3.编译一下 准备把新增的Model迁移到数据库 打开 程序包管理器 ...

  8. CCF 201709-3 JSON查询

    CCF 201709-3 JSON查询 试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript ...

  9. 洛谷 P3806 【模板】点分治1-树分治(点分治,容斥版) 模板题-树上距离为k的点对是否存在

    P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式 n,m 接下来n-1条边a,b,c描述a到b有一条长度 ...

  10. xss、SQL测试用例小结

    xss测试用例小结: <script>alert("跨站")</script> (最常用)<img scr=javascript:alert(&quo ...