一尘不染

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

go

我提到了这个问题 - 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返回值传递。

如何做到这一点?


阅读 273

收藏
2021-12-20

共1个答案

一尘不染

使用errors包来创建新的错误。

err = errors.New("an error")

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

recover除非您真的知道自己在做什么,否则不要使用。返回所有错误并在它们出现时处理它们是惯用的做法。

编辑:

重新阅读您的问题,您似乎正在尝试从可能失败的类型断言中恢复。在这种情况下,建议使用“逗号,好的”习语(在文档的先前链接部分中提到),这(稍微解释为更通用)意味着:

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

测试 aninterface{}是否实际上是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 is float64
could not assert that “foo” is float64.

Playground

2021-12-20