使用go 1.13,我们现在可以通过fmt.Errorf("... %w ...", ..., err, ...)
(https://golang.org/pkg/errors)来包装错误。
虽然这很棒,但似乎无法创建自定义格式器。假设我想根据错误的深度使用不同的空格,如果我只获得错误的字符串表示形式err.Error()
,我将得到树中的所有错误。
请参见下面的示例。
我尝试将fmt.Sprintf
与%s
和%v
动词一起使用,从Error()
和fmt.Sprint
获取字符串表示形式。
// sprintError prints err in top-down order
func sprintError(err error) string {
var stack []string
level := 0
spacesPerLevel := 2
for err != nil {
space := strings.Repeat(" ", level*spacesPerLevel)
msg := fmt.Sprintf("%s%s", space, err)
stack = append(stack, msg)
err = errors.Unwrap(err)
level++
}
msg := strings.Join(stack, "\n")
return msg
}
示例:
err := fmt.Errorf("level 1")
err = fmt.Errorf("level 2: %w", err)
fmt.Print(sprintError(err))
输出:
level 2: level 1
level 1
预期:
level 2:
level 1
答案 0 :(得分:0)
[T]这里似乎无法创建自定义格式程序
完全正确。原始提案的该部分并未纳入Go 1.13。 因此,您至少不能以简单的方式完成自己想做的事情。 您可以尝试从原始内容中剥离未包装的错误字符串 但这依赖于字符串操作。