врапаем ошибку через fmt.Errorf, стек трейса там не оказывается, верно? Надо использовать для этого github.com/pkg/errors
еще есть https://pkg.go.dev/golang.org/x/xerrors
да, там нет стектрейса, и не будет 🙁 я дошел до того, что добавляю на каждом уровне строку, чтобы понять, откуд file not found лезет
Вариант, но проще, все же, врапнуть ошибку, я думаю
так я враппингом стандартным и добавляю
покажите пример плиз
fmt.Errorf и %w же
``` package errwithplace import ( "fmt" "runtime" "github.com/jpillora/longestcommon" ) var myPlace = getCaller(-1) func getCaller(skip int) string { funcName := "UNKNOWN" pc, f, l, ok := runtime.Caller(skip + 1) if ok { funcName = runtime.FuncForPC(pc).Name() } _, _, _, _ = pc, f, l, funcName return fmt.Sprintf("%s:%d", f, l) //return funcName } func getCallerShort(skip int) string { names := []string{ getCaller(skip + 1), myPlace, } longestcommon.TrimPrefix(names) return names[0] } func Wrap(err error) error { if err != nil { return fmt.Errorf("%q: %w", getCallerShort(1), err) } return nil } ```
добрый, трейса нет, но если возвращать неповторяющиеся строки в каждом фрагменте кода, то по сути это некий аналог трейса. return fmt.Errorf("this is unique string returned only here 1: %w", err) на выходе имеем что-то типа "this is unique string returned only here 1: this is unique string returned only here 2: original error" чем не трейс? Похоже это то, что @onokonem описал
тем что оно обычно не включает в себя строки в исходниках и имя функции
строка перед ": %w" должна быть уникальной, тогда вам понятно, какая это функция.
не должна она быть уникальной, она должна описывать ошибку и ее контекст
ИМХО так себе затея...
сейчас имею проект с таким подходом и гугл стек - в принципе сразу определяю весь стек по логу
https://github.com/uber-go/guide/blob/master/style.md#error-wrapping собственно
получив ошибку "lalablabla123: file not found" как искать и как понять о чем это вообще и где искать?
похоже у нас с вами трудности понимания. приведу пример. у нас одна функция вызывается из двух других. На выходе у нас будет ошибка failed to a from b: failed to request 3rd party: some err или failed to a from с: failed to request 3rd party: some err Ведь понятен же стек? Причем сделать сообщения разными не составляет труда - это разные функции и давать они должны разный текст ошибки. Если у вас в коде разные функции пишут одинаковые логи - это надо исправлять пока не поздно (потом закопаетесь совсем). Собственно код: func a () error { // err := ... some 3rd party request return fmt.Errorf("failed to request 3rd party: $w", err ) } func b () error { if err := a(); err != nil { return fmt.Errorf("failed to a from b: %w", err ) } return nil } func c () error { if err := a(); err != nil { return fmt.Errorf("failed to a from c: %w", err ) } return nil }
искать код, который пишет lalablabla123.
Обсуждают сегодня