我提到了这个问题 - 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返回值传递。
err
如何做到这一点?
使用errors包来创建新的错误。
errors
err = errors.New("an error")
通过访问err.Error()或使用fmt包函数(例如fmt.Println(err)),可以将返回的错误视为字符串。
err.Error()
fmt
fmt.Println(err)
recover除非您真的知道自己在做什么,否则不要使用。返回所有错误并在它们出现时处理它们是惯用的做法。
recover
编辑:
重新阅读您的问题,您似乎正在尝试从可能失败的类型断言中恢复。在这种情况下,建议使用“逗号,好的”习语(在文档的先前链接部分中提到),这(稍微解释为更通用)意味着:
“如果类型断言失败,[接收者变量] 将仍然存在并且是[任何断言的] 类型,但它将具有零值......”
测试 aninterface{}是否实际上是float64直通类型断言的简单示例,如果失败(而不是恐慌)则产生自定义错误:
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 is float64 could not assert that “foo” is float64.
Playground