Начиная с версии 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