Комментарии 21
Стектрейс есть в панике, для всего остального есть логи, Объединенные контекстом
Стектрейс — единственный способ точно установить где именно возникла ошибка.
Вы, простите, поиском по коду пользоваться умеете?
Стектрейс есть в любом уважающем себя рантайме в исключениях.
Убирая тот факт, что захват фрейма не самая дешевая операция (хотя может быть и дешевой, если компилятор языка умеет преобразовывать вызовы в константные выражения), то развертка стека (в случае исключения) операция по определению недешевая.
В Go стек динамического размера, что делает исключения еще дороже. Вы предлагаете пожертвовать скоростью ради сомнительной выгоды.
нет стектрейса — это грёбаный стыд и феерический косяк разработчиков голанга
В первых версиях errors стектрейс был, но его убрали как раз по той самой причине что а) стектрейс на каждую ошибку это довольно дорого б) непонятно как настроить инспекцию, ведь далеко не всегда нужен стектрейс, а достаточно вывода самой ошибки. Можете глянуть /x/xerrors — там стектрейс до сих пор остался.
захват фрейма не самая дешевая операцияприкрепить к ошибке несколько байт дебаг-символов — дорогая операция?? с чего вы это взяли? Где бенчмарки?
развертка стека операция по определению недешевая.совершенно наплевать на развёртку стека. она происходит один раз на самом верху в момент логгирования ошибки
Каким образом умение поиска по коду поможет найти место возникновения ошибки во внешней библиотеке?
А чем отличается поиск кода в своих проектах и поиска кода в чужих? В Go все довольно просто — ищите где создается ошибка с нужным вам текстом и как она прокидывается.
прикрепить к ошибке несколько байт дебаг-символов — дорогая операция?? с чего вы это взяли? Где бенчмарки?
https://play.golang.org/p/xo3FBPqm1AK 600 ns против 20 ns.
совершенно наплевать на развёртку стека. она происходит один раз на самом верху в момент логгирования ошибки
Почитайте про stack unwinding и как работает panic/recover/defer и что конкретно за вас делает рантайм, чтоб у вас не утекали ресурсы.
Тут просто не надо путать ошибки и исключения. Ошибки это просто данные. Поэтому ошибки можно (в отличие от исключений) использовать для control flow. Было бы очень накладно беспричинно генерировать стектрейсы в рамках ожидаемого control flow.
Я не большой сторонник стектрейсов в ошибках (все-таки, это не исключения), но, помнится мне, в merry была ещё одна интересная возможность — завернуть ошибку err1
в другую ошибку err2
используя Cause
. При этом остается возможность получить и err1
и err2
как отдельные ошибки и достать из них нужную информацию.
Без подобного враппинга идея в Go 1.13 кажется неполной.
Речь идёт о том, чтобы включать стектрейс в любую ошибку, созданную функциями errors.New и fmt.Error.
Непонятно что вы имеете ввиду
errors.Is(fmt.Errorf("%w %w", err1, err2), err1) == err2 //true
errors.Is(fmt.Errorf("%w %w", err1, err2), err1) == err1 //false
Работа с ошибками в Go 1.13