jinliming2
2020-11-03 21:48:28 +08:00
我觉得:Go 里的 if err != nil 判断是否出错,表明这里确实有可能出错,那么不论是什么编程语言,都是有可能出错的。
比如写个除法函数,返回商和余数,但如果除数参数提供了 0,那么结果就是应该出错(不考虑返回无穷之类的情况)。
在其他语言里,这叫“异常”,他们几乎都有 try-catch 语法,来捕获错误,比如:
```
try {
可能出错的函数 A();
可能出错的函数 B();
可能出错的函数 C();
} catch (错误 A) {
} catch (错误 B) {
} catch (错误 C) {
} finally {
}
```
在 Go 里面,实际上也有类似的写法:
```
defer func () {
if err := recover(); err != nil {
// 判读 err 的类型,处理不同错误
}
// finally
}()
可能出错的函数 A()
可能出错的函数 B()
可能出错的函数 C()
```
这样写是不是就有点类似了?
但是不管是 try-catch 还是 panic-recover,他们的问题都是:抛出错误,在某个位置集中捕获。这样在代码层面你就不知道错误具体是在哪里抛出来的了,只能在运行时打堆栈,相同类型的错误也就只能是统一的处理方法。
而 Go 语言的一般风格是:错误在哪里抛出,就在哪里处理掉,这样对错误的处理会比较明确。
比如在一个函数里有两个除法运算,除数都有可能为 0 。那么 try-catch 就只能在捕获到错误时打一个除数为 0 的日志,而 Go 的风格则可以报第一步除数为 0 或是第二步除数为 0 。
当然,try-catch 也可以写成 一行语句一个捕获的形式,那样的话比 if err != nil 更恐怖,而且还有变量块级作用域的问题。