Size: a a a

2021 June 06

RL

Ragnar Lodbrok in Go-go!
Да, работает. Я не знал
источник

ep

egor popov in Go-go!
да, убираем go и defer отработает в примере. Я как раз и хотел бы все паники обработать через recovery, но получается это невозможно => я не могу гарантировать что вызвал sync для логов или close для пулла коннектов ?
источник

с

сонная википедия... in Go-go!
ну так не надо паниковать
источник

VY

Vladislav Yarmak in Go-go!
ну технически можно просто из любой горутины вызвать что-то типа os.Exit и деферы нигде не сработают
источник

VY

Vladislav Yarmak in Go-go!
не важно паника или нет
источник

VY

Vladislav Yarmak in Go-go!
значит, в каждой запущенной горутине где-то должна быть обработка паник
источник

RL

Ragnar Lodbrok in Go-go!
Если я правильно понял, то recover как раз "останавливает" панику из данной горутины
источник

ep

egor popov in Go-go!
да, я делаю recovery, чтобы написать в лог "сервис остановлен после паники" и дальше продолжаю паниковать, вот так:
  defer func() {
   if err := recover(); err != nil {
     logger.Info("the service has been finished panicking")
     panic(err)
   } else {
     logger.Info("the service has been finished normally")
   }
 }()
источник

RL

Ragnar Lodbrok in Go-go!
А зачем паниковать дальше?
источник

ep

egor popov in Go-go!
Чтобы паника выдала правильный stacktrace в stderr
источник

ep

egor popov in Go-go!
ну и плюс там есть еще другие деферы на log.sync, sql.close и т.п.
источник

ep

egor popov in Go-go!
Получается что после паники скажем в grpc горутинах(которые создаются сами grpc кодом), я могу потерять часть логов
источник

VY

Vladislav Yarmak in Go-go!
в том же gin есть Recover-мидлварь, которая оборачивает каждый вызов какого-либо обработчика в рекавер
источник

VY

Vladislav Yarmak in Go-go!
и возвращает 500ку по http
источник

VY

Vladislav Yarmak in Go-go!
вероятно, тут такой же подход подойдёт
источник

ep

egor popov in Go-go!
для grpc я решу это общим интерсептором и перехватом паники в нем, просто сложно все это. В каждую свою горутину "на всякий случай" передавать объекты sql, log и т.п. Ибо потенциально каждая горутина может почему-то запаниковать.
источник

VY

Vladislav Yarmak in Go-go!
так это только в видимости рекавера должен быть sql и log
источник

VY

Vladislav Yarmak in Go-go!
по-моему не особо сложно - эта проблема везде решена похожим способом
источник

ep

egor popov in Go-go!
да, вроде есть идея. Отпишусь как реализую.
источник

VY

Vladislav Yarmak in Go-go!
обычно если запрос изолирован в горутине обработчика запроса, то панику просто в лог выводят, а сервер дальше себе работает
источник