Golang mgo错误

4

mgo 能否返回不同于 QueryError 或 ErrNotFound 的错误?如果是数据库连接错误怎么办?

除了 ErrNotFound 之外的错误发生时,是否将 panic 作为良好的实践,并在 http 处理程序栈的顶部进行恢复,以获得类似状态 500 的漂亮响应?


我已经发布了一个基本回答,但@mgo作者@gustavo-niemeyer可能能够提供更明确的信息。 - Intermernet
2个回答

5
mgo返回的错误集并无限制,因为它执行许多底层操作,这些操作也可能返回错误(DNS解析、连接建立、超时等)。所以,处理mgo的错误的正确方式与大多数地方相同:处理您已知道并具有自定义逻辑的错误,并放弃您不知道的错误。良好的退出包括撤消任何本地副作用(关闭/删除本地创建的文件等),然后将带有自定义上下文信息的错误返回给调用者。
我不会在此类错误上惊慌失措。恐慌通常是用于异常情况的,例如开发人员错误使用API或环境严重受损,最好的做法是完全停止。与数据库(或任何网络相关的内容)的连接应该预期会偶尔中断,并进行适当处理,而不仅仅记录无法区分的崩溃。
如果您有更多细节并希望进一步交流,请转到邮件列表。

谢谢。我现在明白了,在Go语言中构建像Rails中的ActiveRecord那样漂亮的ORM层很困难,而且我从Node.js的“回调地狱”转移到了Go的“错误地狱”。我是不是错过了什么? - Rafał Sobota
如果您在编写函数时正确构建以返回在执行该函数时遇到的任何错误,则只需将它们传递到上一级,直到处理它们(通常在主循环中,但有时不是)。这些错误都是同一类型,并且通常包含非常有用的信息。如果需要构建自己的错误,可以使用errors.New轻松实现:http://golang.org/pkg/errors/#New。无需进入“错误地狱”,请查看Go源代码示例:http://golang.org/src/pkg/。 - Intermernet

3
我相信你可以通过 LastError 检查任何错误。大多数返回错误的函数都会返回一个标准的Go错误,应该在函数返回时进行检查。
通常,在Go中,除非有一些特殊的用例,否则最好处理出现的错误而不是使用 panic/recover。最佳实践是在错误发生时处理它们。
更多信息请参见Error handling and GoDefer, Panic, and Recover来自Go博客

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接