php异常处理小总结
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异常处理小总结的更多相关文章
- C++异常处理小例
学习程序的好方法是阅读代码和改进代码.下面的程例来自<An Overview of the C++ Programming Language>(5.1 异常和错误处理)程序用途:使用C ...
- python学习之----异常处理小示例
网络是十分复杂的.网页数据格式不友好,网站服务器宕机,目标数据的标签找不到,都 是很麻烦的事情.网络数据采集最痛苦的遭遇之一,就是爬虫运行的时候你洗洗睡了,梦 想着明天一早数据就都会采集好放在数据库里 ...
- 2.scala控制结构、函数、异常处理
2.scala控制结构.函数.异常处理---小书匠,在线编辑器,MARKDOWN,Evernote,文件版本 a:focus { outline: thin dotted #333; outline: ...
- [转]小D课堂 - 零基础入门SpringBoot2.X到实战_汇总
原文地址:https://www.cnblogs.com/wangjunwei/p/11392825.html 第1节零基础快速入门SpringBoot2.0 小D课堂 - 零基础入门SpringBo ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_汇总
第1节零基础快速入门SpringBoot2.0 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_1.SpringBoot2.x课程介绍和高手系 ...
- 爬虫请求库——selenium
selenium模块 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题.selenium的缺点是效率会变得很慢. sel ...
- 爬虫-selenium 模块-02
目录 selenium 模块 chromedriver 浏览器驱动下载与存放 PhantomJS 无界面浏览器 标签元素查找方法 xpath 格式用法 获取标签属性 等待元素被加载 元素交互操作 点击 ...
- python使用笔记17--异常处理
什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Pyth ...
- SpringBoot小技巧:统一异常处理
SpringBoot小技巧:统一异常处理 情景描述 对于接口的定义,我们通常会有一个固定的格式,比如: 但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格 ...
随机推荐
- python基础笔记-列表
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可. def main(): ...
- 常用 shell 命令 chmod | root
chmod 命令 chmod 命令 [格式1:] chmod [ugoa][+-=][rwx] 文件或目录 /*u.g.o.a : u属主,g属组,o其他用户,a所有用户*/ /*+.-.= : 增加 ...
- 在Maven项目中,jsp不解析el表达式
我的这个项目是用Maven-archetype-webapp项目创建的,如下图所示: 有这种方式创建有一个坑,就是它使用的servlet版本是2.3,而servlet2.4以下的版本是不会自动解析el ...
- virtual abstract override
virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...
- 例程使用(1-4)共享内存 存图片+vector容器教程
1传输的数据 1-1数据格式说明 1 两路视频图像Mat 图像 图像数据(Mat)+图像头信息(ImgInf) //图像的宽.高.类型信息 typedef struct { int width; // ...
- (11)树莓派3 有线网卡静态IP设置
https://www.cnblogs.com/10e-6/p/5778355.html 树莓派设置静态IP地址 首先终端输入: ifconfig 查看树莓派默认分配的动态IP地址. 图 1-4 配置 ...
- openjudge1.2
目录 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.2.10 1.2.1 描述 分别定义int,short类型的变量各一个,并依次输出 ...
- 【ARC098F】Donation
[ARC098F]Donation 题面 atcoder 题意: 给定一张\(n\)个点,\(m\)条边的无向图.这张图的每个点有两个权值 \(a_i,b_i\). 你将会从这张图中选出一个点作为起点 ...
- C++ STL(标准模板库)的学习了解
C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...
- yum本地安装rrdtool报错,提示版本冲突的解决办法
[root@mysql-mon40 mm]# yum localinstall rrdtool-1.4.7-1.el6.rfx.x86_64.rpm -y 错误: Multilib version p ...