如何在golang中获取字符串中的错误消息?
我提到了这个问题-,但这在我的情况下不起作用如何在golang中获取字符串中的错误消息?,go,Go,我提到了这个问题-,但这在我的情况下不起作用 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"]
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.New("an error")
通过访问err.error()
,或使用fmt
包函数(例如fmt.Println(err)
),可以将返回的错误视为字符串
除非你真的知道自己在做什么,否则不要使用recover
。习惯做法是返回所有错误,并在出现错误时进行处理
有关更多信息,请参阅和在线博客
编辑:
重新阅读您的问题,看起来您正在尝试从可能的失败中恢复。在这种情况下,建议使用“逗号,ok”惯用语(在文档前面的链接部分中提到),它(稍微解释为更一般)意味着:
“如果类型断言失败,[接收器变量]仍将存在,并且类型为[断言的内容],但它将具有零值…”
通过类型断言测试接口{}
是否实际上是float64
,并在失败时生成自定义错误(而不是惊慌失措)的简单示例:
将打印:
1024.000000是浮动64无法断言“foo”是float64
我想这会满足您的要求:
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
}
添加到,如果您正在使用errors.New()
创建自定义错误消息,您可能希望保持对所创建的特定错误消息的签出。此外,还可以以相同的方式检查其他错误消息。只需使用fmt.Sprintf()
或fmt.Print()
函数即可
您可以非常简单地执行此操作:
如果fmt.Sprint(err)=“我的自定义错误”{
//做点什么
}
这个问题无法回答。从recover
返回的值是您使用调用的panic
。所有这些都将变得极其复杂。如果您知道只使用字符串调用panic,那么只需键入assert to string。这里最好的建议是:在操场上展示整个可运行的代码,并描述您希望看到的内容。类似于t.TransObject[“qty”](map[string]interface{})[“ticket fv”](float64)
的代码指出了正确建模域的一些重要问题。也许您可以尝试一种不需要空接口和类型断言的解决方案,而不需要大量的panic/defer/recover魔法?补充一点:将错误作为字符串返回不是一种好的做法。创建您自己的错误类型type MyError error
并为其提供一个方法:func(m*MyError)error()string
-这就是满足error
接口所需的全部内容。阅读本文了解更多信息:blog.golang.org/error-handling-and-goThanks回复。我会创造错误,你说什么就好。在某些情况下,如果我需要恢复,意味着我将如何获得字符串中的错误?我的要求是记录系统生成的错误。请给我一些建议。@shanerror
是一个错误。调用此方法以检索消息。或者,fmt
包可以处理error
值并自动打印消息,因此您只需使用fmt.Println(err)
打印消息。@nemo实际上,如果我尝试str.error(),它会说str.error未定义(类型接口{}没有字段或方法错误)
此错误。抱歉,我无法理解..问题是str是一个recover对象。所以我猜它不会出现。我对这种语言非常陌生,而且搞砸了。@shanrecover
提供了一个接口{}
值,一个可以容纳任何值的值。您必须断言该值是否实现错误
接口。之后,您可以对其调用Error()
。看见
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
}