2014-09-27 63 views
1

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

我要分配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!") 
+1

出于好奇,为什么你需要'[]字节'的错误?我唯一的猜测就是你想把它写入一个文件,'io.Writer'需要一个'[]字节'。如果是这样,有更简单的接口可以接受字符串。 – LinearZoetrope 2014-09-27 20:09:37

+0

你是什么意思?是的,我正在写'os.Stderr'和一个文件 – clarkk 2014-09-27 20:16:48

+1

使用'fmt.Fprint [ln | f](io.Stderr,“我的字符串”)'事实上,你可以用'fmt.Fprintf (io.Stderr,“%s%v \ n”,prefix_err,err)' – LinearZoetrope 2014-09-27 20:18:25

回答

3

这里有两个不同的问题:

第一个问题:实际error类型实际上是一个内置-in界面。为了实现它,你需要实现一个类型为func Error() string的方法。所以error类型的任何东西都可以通过调用它的Error函数转换为字符串格式。

第二个问题:panic不参加error,它需要interface{}。内建的recover类似地返回您传递给panic的任何interface{}。在这种情况下,拨打Error将不起作用。事实上,你没有通过errorpanic,你通过了string(这很常见)。

有很多方法可以从interface{}获得string,而大型开关是一个。但总体来说,我认为最简单的选择是

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,包括日志文件。

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 

如果你不能肯定你会得到哪一个,你可以输入查询时,您恢复并相应地处理。