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错误,且不同于我们定义的数据格 ...
随机推荐
- vue-router有哪几种导航钩子?(具体怎么用的)
三种,第一种:是全局导航钩子:router.beforeEach(to,from,next),作用:跳转前进行判断拦截.第二种:组件内的钩子第三种:单独路由独享组件 .
- Spark RDD :Spark API--图解Spark API
面试题引出: 简述Spark的宽窄依赖,以及Spark如何划分stage,每个stage又根据什么决定task个数? Stage:根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个 ...
- 输入一个表示整数的字符串,把该字符串转换成整数并输出(实现atoi函数功能)
例如输入字符串"345",则输出整数345.-----------------------------此题一点也不简单.不信,你就先不看一下的代码,你自己先写一份,然后再对比一下, ...
- css绘制各种图形,三角形,长方形,梯形
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8cAAADVCAIAAAD1mxUAAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWX ...
- 用数据让我们的OKR变得“冷酷”却更有价值
在外企工作过的朋友大多能感受到数据在工作中的重要性,你要设置一个目标要有明确的数据来衡量,你要汇报工作进展要有清楚的数据来显示进度,你要展示工作成果更是需要有代表性的数据来呈现结果,数据是真真实实的结 ...
- ArrayList :货物库存管理(遍历)
package com.oracle.demo01; import java.util.ArrayList; import java.util.Scanner; public class De ...
- 文件搜索命令(命令搜索)which、whereis
一.which命令: 搜索命令所在目录(绝对路径)或者别名信息. 用户可以使用的命令存放在: /bin /usr/bin 管理员使用的命令: /sbin /usr/sbin 1.带有别名的命令: 二. ...
- Shell字符串截取(非常详细)
假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. 1 echo ${var#*//} 其中 var 是变量名,# 号是运算符, ...
- SpringCloud-Feign声明式服务调用
在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率 ...
- IntelliJ IDEA 统一设置编码为utf-8编码 /idea设置编码
问题一. File->Settings->Editor->File Encodings 问题二. File->Other Settings->Default Settin ...