从错误接口获取错误字符串

时间:2014-09-27 19:49:08

标签: go

如何从错误界面获取字符串错误?

我想将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!")

2 个答案:

答案 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

如果您不确定自己会得到哪一个,则可以在恢复时进行检查并进行相应处理。