当前位置: > > > > 我可以使用指向“错误”的指针来捕获返回错误吗?
我可以使用指向“错误”的指针来捕获返回错误吗?
来源:stackoverflow
2024-04-25 09:09:35
0浏览
收藏
Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《我可以使用指向“错误”的指针来捕获返回错误吗?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!
问题内容
我正在编写一些事务开始/提交/回滚函数,我想将块配对以防止忘记提交
我是这样写的:
func (foo *foo) bar() (err error) {
foo.begin()
defer foo.end(&err)
//some business code
return
}
func (foo *foo) end(eptr *error) {
// if recover
if r := recover(); r != nil {
debug.printstack()
*eptr = r.(error)
}
var err = *eptr
if err != nil {
foo.rollback()
} else {
foo.commit()
}
}
它可以工作,但它使用“接口指针”,我找不到有关接口指针的规范。
所以,我不确定这段代码是否足够好。您能给一些建议吗?
感谢 teyzer 和 corey ogburn,这是我的固定解决方案:
func (foo *Foo) Bar() (err error) {
foo.Begin()
defer func() { foo.End(err) }()
defer func() {
if r := recover(); r != nil {
debug.PrintStack()
err = makeError(r)
}
} ()
//some business code
return
}
func (foo *Foo) End(err error) {
if err != nil {
foo.Rollback()
} else {
foo.Commit()
}
}
解决方案
当到达 defer 时,立即评估延迟函数的参数。这就是为什么如果您推迟 end 本身,则必须使用指针。
相反,您可以使用闭包。您的 bar() 函数如下所示:
func (foo *Foo) Bar() (err error) {
foo.Begin()
defer func() { foo.End(err) }()
//some business code
return
}
此处,一旦执行延迟闭包,就会评估 err 的值。
如果您不坚持使用错误返回,那么在 go 中使用恐慌和恢复是处理此类需要回滚的错误的更惯用的方法(就像 corey ogburn 推荐的那样)。
以上就是《我可以使用指向“错误”的指针来捕获返回错误吗?》的详细内容,更多关于的资料请关注米云公众号!
