我提到了这个问题 - 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
。
如何实现?
答案 0 :(得分:75)
使用errors
包创建新错误。
err = errors.New("an error")
通过访问err.Error()
或使用fmt
包函数(例如fmt.Println(err)
),可以将返回的错误视为字符串。
除非您真正知道自己在做什么,否则请勿使用recover
。返回所有错误并在它们出现时处理它们是不恰当的。
有关详细信息,请参阅Go博客上的Error handling and Go和Defer, Panic and Recover。
编辑:
重新阅读您的问题,看起来您正试图从可能失败的type assertions中恢复。在这种情况下,建议使用“逗号,确定”的习惯用法(在以前链接的文档部分中提到),其中(稍微解释为更一般)意味着:
“如果类型断言失败,[接收器变量]仍然存在并且类型为[无论什么被断言],但它将具有零值......”
测试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。
答案 1 :(得分:8)
我认为这会做你想要的:
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
}
答案 2 :(得分:0)
添加到@intermernet's answer时,如果要使用errors.New()
创建自定义错误消息,则可能需要对所创建的特定错误消息进行检查。另外,其他错误消息也可以用相同的方式检查。只需使用fmt.Sprintf()
或fmt.Print()
函数即可。
您可以很简单地做到这一点:
if fmt.Sprint(err) == "My Custom Error" {
// do something
}