如何从错误界面获取字符串错误?
我想将ERROR: Fake error!
分配给变量,然后将其转换为切片[]byte(error_str)
prefix_err := "ERROR: "
defer func() {
if err := recover(); err != nil {
// get error message from "err" as string
}
}()
panic("Fake error!")
答案 0 :(得分:4)
这里有两个不同的问题:
第一个问题:实际的error
类型实际上是一个内置接口。要实现它,您需要在类型func Error() string
上实现一个方法。因此,error
类型的任何内容都可以通过调用其Error
函数转换为字符串格式。
第二个问题:panic
不接受error
,而是interface{}
。 recover
内置版同样会返回您传递给interface{}
的所有panic
。在这种情况下,调用Error
将不起作用。实际上,您没有将error
传递给panic
,而是传递了string
(这很常见)。
有很多方法可以从string
获得interface{}
,而大型交换机就是其中之一。但总体而言,我认为最简单的选择是
myBytes := []byte(fmt.Sprintf("%s%v", prefix_err, err))
总是会得到{}所用接口的字符串表示形式,根据需要调用String()
或Error()
,然后将其转换为[]byte
。
(小脚注:在变量名中使用下划线并不考虑Go样式,而是使用camelCase)。
编辑:
事实证明,我们有一个部分的“X Y问题”转换为[]byte
以写入io.Writer
。如果您想将此记录到Stderr,则可以使用fmt.Fprintf(os.Stderr, "%s%v\n", prefix_err, err)
甚至fmt.Fprintln(os.Stderr, prefix_err, err)
。任何Fprint
都将正确打印到任何io.Writer
,包括日志文件。
答案 1 :(得分:0)
恐慌并不总是采用错误的类型。在你的情况下,你传递一个字符串。
panic("Fake Error")
err := recover() // => string (interface)
要在错误界面上恢复,您需要传递错误
panic(fmt.Errorf("Fake Error!"))
err := recover() // => error (interface)
e := err.(error) // type check
e.Error() // => string
如果您不确定自己会得到哪一个,则可以在恢复时进行检查并进行相应处理。