如何在golang中的字符串中获取错误消息?

新手上路,请多包涵

我提到了这个问题 - os.Error - string value (Golang) ,但这对我来说不起作用。

 func (t Trans) TicketQty() (intQty int, err string) {
  defer func() {
    str := recover()
    if(str != nil){
      err = "an error"
    }
  }()
  Qty := t.TransObject["qty"].(map[string] interface{})["ticket fv"].(float64)
  intQty = 10
  return
}

在那 err 我需要抛出的错误消息,例如,如果解析逻辑失败,它会自动抛出错误。那是我需要捕获的错误。我只是为了举例说明这一点——无论运行时异常是什么,我都需要捕获它并在返回时作为 err 传递。

如何实现?

原文由 shanmugharaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 575
2 个回答

使用 errors 包创建新错误。

 err = errors.New("an error")

可以通过访问 err.Error() 或使用 fmt 包函数(例如 fmt.Println(err) )将返回的错误视为字符串。

不要使用 recover 除非你 _真的知道你在做什么_。返回所有错误并在它们出现时处理它们是惯用的。

有关详细信息,请参阅 Go 博客上的 错误处理和 Go 以及 Defer、Panic 和 Recover

编辑:

重新阅读您的问题,您似乎正在尝试从可能失败的 类型断言 中恢复。在这种情况下,建议使用“comma, ok”成语(在文档的先前链接部分中提到),它(略微释义更一般)意味着:

“如果类型断言失败,[接收者变量] 将仍然存在并且属于 [任何被断言的] 类型,但它将具有零值……”

通过类型断言测试 interface{} 是否实际上是 float64 的简单示例,如果失败则生成自定义错误(而不是恐慌):

 package main

import (
    "errors"
    "fmt"
)

// assertFloat64 attempts a type assertion to float64.
// It returns a custom error if it fails.
func assertFloat64(n interface{}) error {
    // Type assertion. Is n float64?
    f, ok := n.(float64)
    // If yes,
    if ok {
        // print the result
        fmt.Printf("%f is float64\n", f)
        // and return nil error.
        return nil
    }
    // Else return our custom error
    return errors.New(fmt.Sprintf("could not assert that \"%v\" is float64.\n", n))
}

func main() {
    // Successful
    // 1024.0 is float64
    err := assertFloat64(1024.0)
    if err != nil {
        fmt.Println(err)
    }

    // Failure
    // "foo" isn't float64
    err = assertFloat64("foo")
    if err != nil {
        fmt.Println(err)
    }
}

将打印:

1024.000000 是 float64

无法断言“foo”是 float64。

操场

原文由 Intermernet 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为这会做你想要的:

 func (t Trans) TicketQty() (intQty int, err error) {
  defer func() {
    ex := recover()
    if(ex != nil){
      // "%v" prints the value of ex
      // for strings, it is the string, for errors .Error() method, for Stringer the .String() etc
      // Errorf returns an error instead of a string
      err = fmt.Errorf("%v", ex)
    }
  }()
  ... // do your thing
  return
}

原文由 metakeule 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题