Golang巧用巧用defer进行错误处理的方法进行错误处理的方法
本文主要跟大家介绍了Golang巧用defer进行错误处理的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:
问题引入问题引入
毫无疑问,错误处理是程序的重要组成部分,有效且优雅的处理错误是大多数程序员的追求。很多程序员都有C/C++的编程背
景,Golang的程序员也不例外,他们处理错误有意无意的带着C/C++的烙印。
我们看看下面的例子,就有一种似曾相识的赶脚,代码如下:
func deferDemo() error {
err := createResource1()
if err != nil {
return ERR_CREATE_RESOURCE1_FAILED
}
err = createResource2()
if err != nil {
destroyResource1()
return ERR_CREATE_RESOURCE2_FAILED
}
err = createResource3()
if err != nil {
destroyResource1()
destroyResource2()
return ERR_CREATE_RESOURCE3_FAILED
}
err = createResource4()
if err != nil {
destroyResource1()
destroyResource2()
destroyResource3()
return ERR_CREATE_RESOURCE4_FAILED
}
return nil
}
从代码的实现中可以看出:在一个函数中,当创建新资源失败时,则要清理所有前面已经创建成功的资源,这使得函数中有了
重复代码的坏味道,比如destroyResource1函数调用了3次,destroyResource2函数调用了2次。
重构一:一个重构一:一个defer + 多个多个flag
Golang提供了一个很好用的关键字defer,当包含defer的函数执行完毕时(不管是通过return的正常结束,还是由于panic导致
的异常结束),defer语句才被调用。
考虑到这一点,我们尝试将所有资源在defer语句中统一清理。由于函数返回时,不知道是否需要清理以及清理那些资源,所
以要增加多个flag。
重构后的代码如下所示:重构后的代码如下所示:
func deferDemo() error {
flag := false
flag1 := false
flag2 := false
flag3 := false
defer func() {
if !flag {
if flag3 {
destroyResource3()
}
if flag2 {
destroyResource2()
}
if flag1 {
destroyResource1()
}
}