如何在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回复。我会创造错误,你说什么就好。在某些情况下,如果我需要恢复,意味着我将如何获得字符串中的错误?我的要求是记录系统生成的错误。请给我一些建议。@shan
error
是一个错误。调用此方法以检索消息。或者,
fmt
包可以处理
error
值并自动打印消息,因此您只需使用
fmt.Println(err)
打印消息。@nemo实际上,如果我尝试str.error(),它会说
str.error未定义(类型接口{}没有字段或方法错误)
此错误。抱歉,我无法理解..问题是str是一个recover对象。所以我猜它不会出现。我对这种语言非常陌生,而且搞砸了。@shan
recover
提供了一个
接口{}
值,一个可以容纳任何值的值。您必须断言该值是否实现
错误
接口。之后,您可以对其调用
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
}