Golang 如何优雅处理 error?

长久以来,Go 的错误处理方式都被人诟病,100行的代码可能有50行 if err != nil, 代码看起来比较乱。

有没有优雅的方式处理呢?

相信不少童鞋都看过网上一些 “Go 错误最佳实践”。通过这些实践教程,发现虽然可以减少一部分 if err != nil 代码模板,但其实还是相当繁琐。

虽然现在可以使用 errors.Is 判断错误对象相等,或使用 errors.As 错误类型判断。只是解决了 error 更精准化的判断,使用之前还是要判断错误是否为nil。

私以为 Go 中的错误处理很难做到优雅,其根本原因在于Go的语言设计。Go 中的 error 被定义为值,和普通的变量一样

为什么这样设计呢?

Go 希望开发者能处理代码中“可预见的错误”。而不是一味地抛出异常。这和我们经常用的 Java 或 PHP 有很大区别。

在使用 Java 做可能出错逻辑时,一般会使用 try catch 结构。

1
2
3
4
5
6
try {
  //  逻辑代码
}
catch(Exception e) {
  //  处理异常
}

这样对于开发者很友好,try catch 可以处理多个异常,甚至嵌套异常。这样不会破坏代码结构,易于阅读。

对于try catch go 中也有对应的异常处理。

1
2
3
4
5
6
7
8
func main() {
	defer fmt.Println("in main")
	if err := recover(); err != nil {
		fmt.Println(err)
	}

	panic("unknown err")
}

总结

Go 中的错误和异常不是一回事,错误是值,对值得处理属于逻辑的一部分,异常为不可控。

参考

updatedupdated2021-11-012021-11-01
加载评论