加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

可接受的Golang惯用嵌套错误处理?

发布时间:2020-12-16 09:25:51 所属栏目:大数据 来源:网络整理
导读:我最近进入Go并看到了很多关于如何进行错误处理的讨论. 我看到的模式如下: err := DoSomething()if err != nil { //handle}// continue 经常在管理amqp连接时,我的条件是我只想在错误为nil时继续,因为那时我需要在连接上做一些事情: c,err := Connect()if
我最近进入Go并看到了很多关于如何进行错误处理的讨论.

我看到的模式如下:

err := DoSomething()
if err != nil {
   //handle
}
// continue

经常在管理amqp连接时,我的条件是我只想在错误为nil时继续,因为那时我需要在连接上做一些事情:

c,err := Connect()
if err != nil {
   return nil,err
}
s,err := c.RegisterSomethingOnConnection()
if err != nil {
   return nil,err
}
val,err := s.DoSomething()
return val,err

如你所见,我只想运行c.RegisterSomethingOnConnection行,如果从Connect()返回的错误是nil.

但是,由于提前退货,我不喜欢上述情况.早期的回报让我感到不舒服,因为从长远来看,它会损害可读性,并且在功能退出时会完全模糊.到目前为止,我的解决方案是执行以下操作:

var err error
var val ReturnType

c,err := Connect()
if err == nil {
    s,err := c.RegisterSomethingOnConnection()
    if err == nil {
       val,err = s.DoSomething()
    }
}
return val,err

我喜欢这样做有两个原因.首先,它可以防止返回零.其次,我发现它使代码更易于维护,因为您可以在返回(即日志记录)之前添加轻松添加功能,并且由于提前返回而没有某些路径错过添加的功能.

是我做了什么可以接受惯用Go或者我只是需要克服我对早期回报的厌恶并遵循那种模式?

解决方法

Go Prover之一是:

不要只检查错误,优雅地处理它们

我建议你从Dave Cheney那里阅读这篇post

我把重点放在这里:

“没有一种方法可以处理错误.相反,我认为Go的错误处理可以分为三个核心策略”

> Sentinel错误:

if err == ErrSomething {…}

“使用sentinel值是最不灵活的错误处理策略,因为调用者必须使用相等运算符将结果与预先声明的值进行比较.当您想要提供更多上下文时会出现问题,因为返回不同的错误会破坏相等性检查“.

>错误类型

if err,ok:= err.(SomeType);好 { … }

“错误类型是您创建的实现错误接口的类型.”

>不透明的错误

x,错误:= bar.Foo()
???if err!= nil {
???????回报错误
???}
//使用x

“我将此样式称为不透明的错误处理,因为虽然您知道发生了错误,但您无法查看错误.作为调用者,您对操作结果的所有了解都是它有效,或者它没有.”

….阅读所有帖子.

我认为错误处理的重要方面是不要只检查错误,优雅地处理它们,我希望这可以帮助你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读