文档章节

如何判断你该不该抛出异常,以及抛出什么异常?

wanxiangming
 wanxiangming
发布于 06/28 12:40
字数 1197
阅读 48
收藏 0

前情

最近在完成公司的一个上报征信数据的项目,项目不大,所以开发人员就我一个人,但是工期挺紧,所以每天都写代码写到起飞。项目到尾期后,有一些闲暇可以 review 一下代码。结果发现,我所有的参数校验都是在 controller 层完成的,service 层没有校验。思索了一下,发现一个有趣的之前我没有主要到的事情。

问题所在

controller 层校验后,可以通过返回字符串的形式,提示前端异常信息;service 校验后,需要返回 Exception 给上层。这会导致底层校验产生大量的自定义 Exception,但底层校验相比于顶层校验能辐射系统的更多部分,要想保持系统的健壮性,底层校验是必须的。那么由于底层校验导致上层代码涌现很多 try catch 怎么办?这些 try catch 还可能是级联的,一层一层抛出去。

先缕一缕异常的种类

service 层(这里举了 service 层的例子,实际上可以延伸到任何下层系统)可能抛出哪些异常?参数格式异常(比如要一段英文字符串,但是传入了数字字符串),业务逻辑异常(比如,数据重复或者找不到)。第一次想到这里的时候我脑袋里想的全是 checked 异常。但是灵光一闪,我发现 java 不是还有 unchecked 异常吗?

咱们先思索一下,明确 checked 异常和 unchecked 异常的区别。checked 异常表示,这个异常的出现是正常的,允许的,所以你需要在编程阶段考虑它。unchecked 异常表示这个异常是不正常的,它的出现表示你的代码存在逻辑错误,所以你需要在编程阶段保证它在运行时不发生。

现在我们有了两种异常定义的思路,一个是站在具体程序逻辑角度思考的(参数格式异常,业务逻辑异常),一个是站在编程语言角度思考的(checked 和 unchecked 异常)。

两种思考角度能否产生关联?

我们来看看 java 自己是怎么做的。

从 java 的一些库的设计上来说,通常参数的格式都作为一种协议,默认是大家都知道的,所以当格式错误的时候,程序抛出 unchecked 异常,你需要根据协议保证传入参数的正确性。java 有一个异常叫 IllegalArgumentException,它的出现表示“参数的前提条件不成立”,这个“前提条件”就是参数的协议。由于前提条件是通过文档等提前说明的,所以这是一种可预期异常(当你调用一个方法的时候,你就知道哪些错误的参数会导致异常发生)。

java 有例子可以来说明 checked 异常,如 IOException,程序的 IO 必然和硬件打交道,而硬件并不像程序一样稳定,硬件可能掉电,可能因高温损坏,这些都是不可预期的,IOException 就可以用来表示与硬件交互过程中发生的不可预期错误。所以 File 类中出现 IOException,Apache 的CloseableHttpClient 类中出现 IOException。

啊哈!

有了 java 的例子,我们似乎可以更清晰的辨识 service 应该如何抛出异常了。简单来说,可预期的错误是 unchecked 的,不可预期错误是 checked 的。比如用户注册的 service 层方法,用户名,密码的格式异常是 unchecked 的,用户名已存在的异常是 checked 的。

如此,大量的参数控制逻辑,可以通过抛出一个 unchecked 的 IllegalArgumentException 来实现(向 java 学习),我们也不必为它们自定义异常类,上层也不会被它们困扰,上下层通过接口抽象来完成这种异常的处理。而另一些不可预期的异常,我们可以通过抛出自定义异常类的方式来表达错误发生了。由于剔除了参数校验的异常,这部分需要上层 try catch 的异常的数量就显得不是很可怕了,毕竟大多数业务逻辑可能根本不存在不可预期异常。

© 著作权归作者所有

wanxiangming
粉丝 3
博文 24
码字总数 38833
作品 0
东城
私信 提问
一文看懂 .NET 的异常处理机制、原则以及最佳实践

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/WPwalter/article/details/94610764 什么时候该抛出异常,抛出什么异...

walter lv
07/04
0
0
【Java入门提高篇】Day17 Java异常处理(下)

  今天继续讲解java中的异常处理机制,主要介绍Exception家族的主要成员,自定义异常,以及异常处理的正确姿势。 Exception家族   一图胜千言,先来看一张图。   Exception这是一个父类...

雨淡云稠
2018/05/10
0
0
python的异常处理,以及自定义异常

写出来的python程序不一定是完全正确的。即使所有逻辑都对了,但是用户在使用过程的不当,也会导致程序运行出错。 本文结构: 常见的异常类型 如何处理异常 如何自定义异常 1. 常见的异常大概...

hello_cjq
2016/10/20
0
0
面试官问我,使用 Dubbo 有没有遇到一些坑?我笑了。

本文转载自肥朝(订阅号id:feichao_java),经其本人同意授权转载。 17 年的时候,因为一时冲动没把持住(当然最近也有粉丝叫我再冲动一把再更新一波),结合面试题写了一个系列的 Dubbo 源码...

Qunar技术沙龙
05/24
0
0
面试官问我,使用Dubbo有没有遇到一些坑?我笑了。

前言 17年的时候,因为一时冲动没把持住(当然最近也有粉丝叫我再冲动一把再更新一波),结合面试题写了一个系列的Dubbo源码解析.目前公众号大部分粉丝都是之前的粉丝,这里不过多介绍. 根据我的面...

李红欧巴
03/09
56
0

没有更多内容

加载失败,请刷新页面

加载更多

Java描述设计模式(11):观察者模式

本文源码:GitHub·点这里 || GitEE·点这里 一、观察者模式 1、概念描述 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式。观察者模式定义了一种一对多的依赖关系,让多...

知了一笑
50分钟前
6
0
Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/GoForwardToStep/article/details/53667566 一、简述 先简...

shzwork
53分钟前
4
0
OSChina 周一乱弹 —— 产品经理和程序员是夫妻?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ocean Eyes》- Billie Eilish 《Ocean Eyes》- Billie Eilish 手机党少年们想听歌,请使劲儿戳(这里) @夏目Jane :风太大。...

小小编辑
今天
520
8
使用CSS自定义属性构建骨架屏

写在前面 几天前看到薄荷前端团队分享的《前端骨架屏方案小结》,突然回想起一年前看到的max bock写的《Building Skeleton Screens with CSS Custom Properties》,翻译整理写下出此文,分享...

前端老手
昨天
18
0
Docker常用命令小记

除了基本的<font color="blue">docker pull</font>、<font color="blue">docker image</font>、<font color="blue">docker ps</font>,还有一些命令及参数也很重要,在此记录下来避免遗忘。 ......

程序员欣宸
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部