项目地址

https://github.com/yinjihuan/kitty-cloud

异常处理不用我讲,大家都清楚。单独的异常处理太繁琐,全局异常处理可以在一个应用中统一进行异常的处理,非常方便。目前全局异常处理用的也越来越广泛,今天跟大家来聊一聊 Kitty Cloud 中的全局异常是如何处理的?

为什么要使用全局异常处理呢?

使用全局异常处理后,我们不需要定义固定类型的返回值,当业务代码报错的时候直接通过异常处理方式来返回给前端或者 API 调用方错误信息。

不使用全局异常处理案例

Web 层

比如我们定义了一个 ResponseData 用来返回固定格式的数据,正常情况下不会有问题,给前端返回的格式也是固定的,如下:

{
"code":200,
"data":{
"name":"yinjihuan"
},
"message":"success",
}

如果业务发生异常,那么这个接口就不会返回上面那样固定格式的数据了,会给我们返回错误页面。除了代码异常还有一种情况就是当访问的 Uri 错误的时候,也会给调用方返回 404 的错误页面,如下:

如果是传统的 Web 项目,里面包含了页面这是没问题的,我们也可以自定义错误页面让用户体验更好一点。但是在这个基本上是前后端分离的开发模式下,后端只提供的数据的 API,不会有页面的内容。所以就算出错了,就算使用者调用的 API 路径错了,也应该返回固定的格式,并且告诉调用方路径错了。所以我们需要全局的异常处理。

业务层

在业务层最常见的用法就是我们可以直接抛出自定义异常,这样在全局异常处理后给调用方返回的还是固定的格式,如果没有全局异常处理,我们可能会用固定的 Response 来做这件事,比如下面的代码:

public Response createOrder(CreateOrderParam param) {
Response checkResponse = paramsCheck(param);
if (!checkResponse.isSuccess()) {
return checkResponse();
}
...........
}
private Response paramsCheck(CreateOrderParam param) {
if (param.getTotalPrice() <= 0){
return Response.fail("金额错误");
} if (param.getGoodsCount() <= 0){
return Response.fail("数量错误");
}
return Response.success();
}

当我们有了全局异常处理后,这边就直接可以抛出自定义的异常了,代码看起来会简洁一些。

public Response createOrder(CreateOrderParam param) {
paramsCheck(param);
...........
}
private void paramsCheck(CreateOrderParam param) {
if (param.getTotalPrice() <= 0){
throw new BizException(
ResponseCode.PARAM_ERROR_CODE, "金额错误");
} if (param.getGoodsCount() <= 0){
throw new BizException(
ResponseCode.PARAM_ERROR_CODE, "数量错误")
}
}

业务层的异常跑出去后,在全局异常中会进行处理成固定的格式,然后返回给调用方。像很多开放平台的 API 都会有很多的 code 来表示不同的异常类型。

内部服务层

内部服务层也就是说内部服务之间的调用,比如我们用 Dubbo, 如果被调用的服务中没有进行全局异常处理,那么当调用的某个接口报错的时候,调用者这边就会直接报错。

如果我们想就算报错了,调用方这边还是能够获取到正常的响应内容,只不过是内容中会告诉我这个请求是成功的还是失败的。

比如下面的远程调用,如果有全局异常处理,那么就可以根据响应判断是否成功,如果没有的话就直接报错了,如果需要对错误进行处理,还得捕获异常进行处理。

ResponseData<UserResponse> user =
userRemoteService.getUser(userId);
if(user.isSuccess()) {
.......
}

全局异常处理

Http 全局异常处理

关于 Http 的全局异常处理,这边就不细讲了,大家可以查看我的这篇文章:https://mp.weixin.qq.com/s/sIkrZTzGP4caKHzKYKqT7A

处理后如果有报错,那么返回的也是固定的数据格式:

{
code: 500,
message: "/ by zero",
data: null,
domain: "kitty-cloud-article-provider",
errors: null,
requestId: "52a9f30323e80d82",
success: false
}

Rpc(Dubbo)全局异常处理

Dubbo 的全局异常处理可以通过 Filter 进行处理,获取执行的结果去进行处理,如果有异常信息就将相应的内容改成统一的失败格式进行返回。

需要注意的是要将 Result 中的 Exception 设置为 null, 因为 Dubbo 内部的 org.apache.dubbo.rpc.filter.ExceptionFilter 也会对异常进行处理,移除掉后 ExceptionFilter 就不会执行对应的逻辑了。

Dubbo 处理后的效果也是会返回固定格式,如下:

Kitty Cloud(HTTP_RPC)的全局异常处理的更多相关文章

  1. Spring Cloud Gateway的全局异常处理

    Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求. 网关都是给接口 ...

  2. mvc自定义全局异常处理

    异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果: ...

  3. 在.NET Core程序中设置全局异常处理

    以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...

  4. springMvc全局异常处理

    本文中只测试了:实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提 ...

  5. MVC 全局异常处理及禁用显示头

    MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...

  6. Spring MVC 解决无法访问静态文件和"全局异常处理"

    我们都知道,Spring MVC的请求都会去找controller控制器,若果我们页面中引入了一个外部样式,这样是没效果的, 我们引入样式的时候是通过<like href="...&q ...

  7. Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本文内容 为什么要全局异常处理? WebFlux REST 全 ...

  8. .NET MVC全局异常处理(二)

    目录 .NET MVC全局异常处理(二) MVC过滤器Filter .NET MVC全局异常处理(二) 对上节的内容进行了补充 MVC过滤器Filter MVC有四种过滤器:Authorization ...

  9. .NET MVC全局异常处理(一)

    目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...

随机推荐

  1. sprint3总结 && sprint4计划

    sprint3总结 在一周时间里,逻辑部分顺利的将数据库,查词,UI部分连接到一起.并且各部分也针对新的要求做出了一些修改,目前数据库和查词alpha版已经完成,UI部分还需要一些美化,逻辑部分也还需 ...

  2. centos7 —— 网络连接问题

    今天用虚拟机(VM)安装好centos7后,发现无法连接网络,百思不得其解: 第一步:找到需要修改的文件位置,查明原因 #.查看网络是否可以ping通 ~ ping www.baidu.com #.查 ...

  3. C# WCF 之优势及特性

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...

  4. Vue 3.0 Composition API - 中文翻译

    Composition API 发布转载请附原文链接 https://www.cnblogs.com/zgh-blog/articles/composition_api.html 这两天初步了解了下 ...

  5. 只会Vue怎么开发小程序?vue和微信小程序的到底有哪些区别?

    写了vue项目和小程序,发现二者有许多相同之处,在此想总结一下二者的共同点和区别. 一.生命周期 先贴两张生命周期图对比下: vue生命周期 小程序生命周期 相比之下,小程序的钩子函数要简单得多. v ...

  6. 2019-2020-1 20199329《Linux内核原理与分析》第十一周作业

    <Linux内核原理与分析>第十一周作业 一.本周内容概述: 学习linux安全防护方面的知识 完成实验楼上的<ShellShock 攻击实验> 二.本周学习内容: 1.学习& ...

  7. 2019-2020-1 20199329《Linux内核原理与分析》第一周作业

    Linux学习随笔 Linux 是一个操作系统,我们的 Linux 主要是系统调用和内核那两层. UNIX前身是Multics,但 UNIX 的商业版本非常昂贵,于是Linus Torvalds(Li ...

  8. NPM 私有仓库的搭建

    NPM 私有仓库的搭建 为什么搭建私有仓库 balabala,当然是有需求的时候嘛 搭建流程 介绍和安装verdaccio 备注: 程序启动后,配置文件为/home/work/.config/verd ...

  9. Taro 2.2 全面插件化,支持拓展和定制个性化功能

    自 2.2 开始,Taro 引入了插件化机制,允许开发者通过编写插件的方式来为 Taro 拓展更多功能或者为自身业务定制个性化功能,欢迎大家进行尝试,共同讨论~ 当前版本 2.2.1 官方插件 Tar ...

  10. zabbix管理,添加监控主机

    一:添加本机为监控主机  二.监控其他Linux主机agent端 1.环境部署 [root@localhost ~]# hostname agent.zabbix.com[root@localhost ...