go 有没有比较合适的异常处理流程方案

2022-07-09 19:29:54 +08:00
 pkupyx

新转 go ,发现接的项目的错误都是这种模式,并且出现次数极多: data, err:= xxx.xxx if err != nil { log.xxx return xxx,err }

有没有 java 那种,只要在业务逻辑里面: throw XxxException

然后在最外层有一个统一的方法拦截全部 RuntimeException 的方式来处理异常流的方法么? exceptionHandler(XxxException xxx){ ... }

3146 次点击
所在节点    程序员
24 条回复
mekingname
2022-07-11 12:15:50 +08:00
@partystart

而且我第一句也写了,对于『无脑略过"的"err 』。不是无脑略过所有 err 。
nothingistrue
2022-07-11 16:07:11 +08:00
@frodez 实际上你并不知道,甚至只是了解一下 Java 的异常机制。Java 的异常机制是:该是自己的事就 catch 住自己处理,不是自己的事就 throw 出去。该自己处理的自己处理,不该处理的抛出去而不要隐藏,这是即正确又方便的事。按照你的思路,来了错误不管是不是自己的就硬去处理,那才是不正确的事。

此外,统一的错误处理逻辑也不是偷懒,它要在全局层面管理异常,需要花费更多而不是更少的精力。那种捕获到异常就只提示一个“有错误”的统一错误处理才是偷懒,但这不是全局异常处理专属的,if (err ) then print "有错误",也能这样偷懒。
frodez
2022-07-11 18:26:12 +08:00
@nothingistrue 你恐怕理解错我的意思了,我没有一句话说过非要自己处理错误,甚至哪怕是不应该自己处理的错误也要自己来处理。而且这和我的意思正相反,因为这不是正确的错误处理方式。

至于统一的错误处理逻辑,统一的错误处理逻辑不会导致必然的错误(但也不等于一定正确),但基本上是更方便的。很多程序员往往混淆了正确处理错误和方便处理错误两件事,因此实际的统一错误处理实践,往往就会通向方便但错误的处理模式。

当然,没有统一的错误处理逻辑,每个错误都必须显式地处理,也不等于必然的正确。就像你说的,if err != nil { print } 也是显式的处理错误方式一样。由于显式处理错误的不方便,就会让很多程序员抵触错误处理,这样也会导致错误。

但在我看来,前者与后者相比,后者起码提供了一个正确且良好的基础,只不过容易因为程序员偷懒而败坏基础。而对于前者,方便比正确更重要,这使得它的基础不够牢固。

所以个人认为,错误处理最好的实践应该是在尽可能显式处理错误的基础上,给程序员提供语法糖、胶水方法、linter 之类的工具,让错误处理变得方便。
SmiteChow
2022-07-13 18:02:50 +08:00
没有

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

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

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

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

© 2021 V2EX