想问问各位大佬,平日开发异常是怎么处理的。

2022-06-20 15:55:16 +08:00
 Renco

曾经写了一段代码,在最逻辑外层捕获了空指针,因为内部逻辑出现空指针一定是数据查不到导致的异常,所以方便处理,我统一在最外层捕获空指针打印 xxx 数据查不到的日志。结果被项目总监拿出来吐槽了。说空指针为什么要去捕获他。让我调整这段代码。然后我就得在内部逻辑判断多个 if 语句去 isEmpty 判断是否为空。。

就是想了解下,我原先这种处理方式是不合适还是异常本身就不应该去捕获再做逻辑判断。

3884 次点击
所在节点    程序员
42 条回复
Renco
2022-06-20 15:55:54 +08:00
有时候我会用,异常捕获来做一些逻辑操作,虽然比较少,这种处理模式是比较非主流的么
abersheeran
2022-06-20 15:58:47 +08:00
不建议最外层捕捉这种通用异常。因为你没办法保证这个异常会不会出现在其他你没想到的地方。

最外层捕捉异常的逻辑一般都是捕捉自己定义的异常,因为能清楚知道它会在什么时候出现、以及该如何处理。
jjwjiang
2022-06-20 15:59:07 +08:00
在可能为空的地方处理空值是一个码农的基本素养之一
Renco
2022-06-20 16:03:09 +08:00
@abersheeran 好吧 清楚了。
Renco
2022-06-20 16:03:23 +08:00
@jjwjiang 偷懒了,两年前写的代码被挖出来嘲讽一波 有点难受
rekulas
2022-06-20 16:04:47 +08:00
我也支持你总监的做法,你在外部捕获虽然表面方便但有这样的问题:
1 你可能很难确定空指针具体是哪个逻辑导致的
2 正常逻辑执行时如果不及时处理空指针有可能出现数据错误-一些本不应该执行到的逻辑被处理了,从而引起 bug
可能还有其他问题...
Renco
2022-06-20 16:05:32 +08:00
@abersheeran 那如果我能保证我捕获的这段逻辑出现的空指针是我能确定的,可以这样处理么。
thinkershare
2022-06-20 16:06:18 +08:00
主要要看你处于什么层次, 你做的这个层的消费者是谁, 如果你作为一个底层库, 要看错误是谁导致的, 如果是用户入参有问题, 我们就是抛出异常, 如果是内部的不受控的上下文依赖导致的问题, 也是直接抛给调用者, 如果是内部业务逻辑错误, 也直接抛给调用者. 如果是外部调用者(普通用户或第三方 API 调用者),那么就需要在外层统一处理一下. 主要是大部分错误就没法处理. 直接返回给调用者. 主要是看是逻辑错误还是其它. 说白了, 异常是一种偷懒的流程控制手段, 看你怎么用.
Renco
2022-06-20 16:06:19 +08:00
@rekulas 明白了,谢谢大佬
hahaba
2022-06-20 16:06:53 +08:00
做法不对,你既然捕获到日志中了,就应该再写个脚本定时删除异常日志,这样就不会发现错误了
thinkershare
2022-06-20 16:11:47 +08:00
另外, 对外在能考虑到的情况是不会抛出系统级别的异常的. 如果事前没有考虑到, 那么就让他直接奔溃. 由宿主层去考虑要怎么执行下一步操作.
abersheeran
2022-06-20 16:11:52 +08:00
@Renco 你没法保证空指针异常一定出自你的这个逻辑。你不是神,你怎么预测未来的代码不会抛出其他情况的空指针异常?

如果你坚持在外层捕捉你这段逻辑的异常,我的建议是你在你的代码逻辑那儿捕捉空指针,重新抛出一个你自定义的异常。
Renco
2022-06-20 16:13:53 +08:00
@abersheeran 可以,受教了
chaoschick
2022-06-20 16:18:27 +08:00
我也喜欢在 controller 层进行异常捕获,
chendy
2022-06-20 16:23:20 +08:00
空指针异常其实不方便统一处理,因为不知道什么东西是 null ,所以通常和其他异常一样,做为“系统异常”处理

一般做法是,业务逻辑里做 == null 判断然后抛自定义的异常 “未找到 xxx”,外加打日志 “id 是 xxx ,查询条件 xxx 的数据未找到”
Saxton
2022-06-20 16:27:30 +08:00
难怪你被吐槽。。 我最近接手到一个项目全部用 try catch 来判空和判非法值,有几个参数是直接 get 的,但并非必填的, 无语死,整个方法拿个 try 套起来,省了几个 if ,你这确实爽了啊,后期维护的人怎么办,吐血给你看吗
Saxton
2022-06-20 16:28:41 +08:00
越想越气,楼主你在哪
AoEiuV020CN
2022-06-20 16:29:30 +08:00
不做空判断的话 idea 会有黄色警告,哪怕只是为了消除警告都可以加个空判断,
Saxton
2022-06-20 16:30:45 +08:00
代码一大堆全部是拿 try 来充当 if ,哪里出问题我必须开调试,不然我根本不知道到底是哪一个方法抛的异常,关键还是捕获的 exception ,我该他的代码还得开个 debug 一步一步走看看到底哪里蹦了
DonaldY
2022-06-20 16:32:21 +08:00
平时代码多考虑会儿,该 throw 的 throw ,该 try 的 try ,有异常的地方打好堆栈。

蔸底拦截是应该有的,提示需要给用户友好,而不是把错误显示在页面上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/860900

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX