如何创建带有1.13错误的自定义格式化程序?

时间:2019-10-23 03:17:44

标签: go error-handling

使用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

1 个答案:

答案 0 :(得分:0)

  

[T]这里似乎无法创建自定义格式程序

完全正确。原始提案的该部分并未纳入Go 1.13。 因此,您至少不能以简单的方式完成自己想做的事情。 您可以尝试从原始内容中剥离未包装的错误字符串 但这依赖于字符串操作。