Как создать пользовательский форматер с ошибкой go 1.13? - PullRequest
1 голос
/ 23 октября 2019

Начиная с версии 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 голосов
/ 23 октября 2019

[T] здесь, кажется, нет способа создать пользовательский форматер

Точно. Эта часть первоначального предложения не попала в Go 1.13. Таким образом, вы не можете делать то, что хотели бы, по крайней мере, не простым способом. Вы можете попытаться удалить развернутую строку ошибки из оригинала, но это зависит от манипуляции со строкой.

...