异常处理原则如下,对无 gc 语言都适用:
1. go 和 java 的异常处理思路( exception vs errorcode )没有本质区别
2. 异常代表了 ExecutionFailure ,代表了 exceptional 。execution failure = exceptional.
ref:
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exception-throwing如果这种情况并非 exceptional ,那么请以 errorcode 返回(或者 xxresult )。
评价:如果你对异常和 errorcode 两种等价的形式的应用场景不明白,那么这一条可以指导你。
3. 吞调异常代表了未知到已知的转换。(未知:exceptional 。吞掉:catch 而不 rethrow )
解释:catch 而不 rethrow 代表了:对于被调函数,这种情况是 exceptional 的,但是对于调用者来说不是。
4. 不忽略未知异常。
翻译:不 catch Exception ,而是 catch SomeException 。
理由:未知异常代表着潜在的 bug 。
例外:根异常捕获器需要 catch Exception ,但是如果是未知的异常,需要通过报警系统通知开发者。
5. catch 、rethrow 、打印日志是正交的概念。
示例 1:rethrow+打日志代表了遇到了 exceptional 的情况,并且想要记录一些诊断信息。
示例 2:只 catch 不 rethrow+打日志代表了遇到了意料之中的错误,并且想要记录一些诊断信息。
对于楼主的问题,以下是具体回答:
在我们公司,数据库驱动层会打日志(和 metrics ),以跟踪具体库的成功率指标,提升可监控性。
开发者如果想要获得面向业务的监控指标,那么需要自己 catch+打日志(+metrics )。(因为一个业务操作可能涉及多个数据源、多次查询)
那么,catch+打日志后是返回 errorcode 还是 rethrow ?请参考 1-5.