登录
首页 >  Golang >  Go问答

我可以使用指向“错误”的指针来捕获返回错误吗?

来源:stackoverflow

时间:2024-04-25 09:09:35 231浏览 收藏

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 推荐的那样)。

以上就是《我可以使用指向“错误”的指针来捕获返回错误吗?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>