可接受的Golang惯用嵌套错误处理?
我最近进入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() “我将此样式称为不透明的错误处理,因为虽然您知道发生了错误,但您无法查看错误.作为调用者,您对操作结果的所有了解都是它有效,或者它没有.” ….阅读所有帖子. 我认为错误处理的重要方面是不要只检查错误,优雅地处理它们,我希望这可以帮助你. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |