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

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

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

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

3891 次点击
所在节点    程序员
42 条回复
Renco
2022-06-20 16:32:28 +08:00
@Saxton 没。。我就少量代码这样处理了,而且是刚毕业写的,这会已经不写类似的代码了。大佬别来揍我: (
Renco
2022-06-20 16:33:23 +08:00
@Saxton 你这个确实恶心,大多数还是用 if 去判断的,也好定位问题。try catch 维护起来 定位错误会很痛苦
leafre
2022-06-20 17:13:14 +08:00
《 effective java 》:对于可恢复的条件使用被检查的异常( CheckedException ),对于程序错误使用运行时异常( RuntimeException )。

NPE 出现,就说明代码健壮性有问题,逻辑错误,快速定位修复,而不是捕获。
taest
2022-06-20 17:55:01 +08:00
如果出现未知的系统异常,那就让他抛出就完事了。
TWorldIsNButThis
2022-06-20 18:06:50 +08:00
我用 null safety 语言 没有这个烦恼
而且所有从 map 取值的操作(都是可为 null 的类型),如果业务上就是不会为 null 的都额外 checknotnull 并捕获上下文里的相关变量抛异常方便排查脏数据的问题
之前切回 java 写一个要处理 null 和 empty 的接口改了五次才改好
wonderblank
2022-06-20 18:10:38 +08:00
让它崩掉。
Morii
2022-06-20 18:13:33 +08:00
@Saxton #17 乍一看我以为你要提刀砍楼主了
ekoaix
2022-06-20 18:44:38 +08:00
总的原则是:1 、在最贴近代码处、发生处进行处理。2 、你能处理就处理,处理不掉就抛出去处理,到能处理的地方去处理。:)有掉绕
kidlj
2022-06-20 18:54:00 +08:00
if err != nil {
// handle err
}
lihengyu
2022-06-20 19:52:09 +08:00
@Saxton 冷静 XD
OutOfMemery
2022-06-20 19:58:51 +08:00
@Saxton #17 兄弟,刀放下,有话好好说🐶
dilu
2022-06-20 20:17:40 +08:00
goer:

if err != nil {
log.Errorf();
}
vchroc
2022-06-20 20:23:10 +08:00
@dilu 写吐了,别到处说了!!!
dilu
2022-06-20 20:31:54 +08:00
@vchroc 哈哈哈哈哈哈 问题不大,我还能再写好几年呢
Red998
2022-06-20 20:36:04 +08:00
Optional 了解下
HackerJax
2022-06-20 21:06:57 +08:00
把你的 find 方法封一下叫 findOrThrowException ,在全局统一处理这里抛出的异常,顺便记上日志。这样在业务层就没必要 care 这种问题了
lmshl
2022-06-20 21:26:00 +08:00
我们用 Option / Either ,非必要不抛异常😏
dddd1919
2022-06-20 21:52:54 +08:00
很多场景的异常是可以预见到的,而且这种异常并称不上是异常,而是合理的逻辑分支,比如 lz 讲到的查不到数据,本来一个判断搞定的事非要抛异常,逻辑不但没有更清晰,还额外增加捕获异常的运行时开销。
如果想都用异常来处理的话,要把各处的异常做细分,保证哪些是可吞掉的哪些是需要抛出的。与其花精力管理异常,不如从源头处理好。当然从性能的角度讲,避免抛异常
ferock
2022-06-20 22:01:58 +08:00
有的时候问题需要暴露的,而不是兜底
Dogtler
2022-06-21 09:07:29 +08:00
Go 好像没有 try catch ,一般是判断 err panic 业务报错则 log 输出

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

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

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

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

© 2021 V2EX