Ни в каких
Я б сказал только в main при инициализации. И то через log.Fatal. А ля: падай, если нету базы данных, или отсутствуют КРИТИЧЕСКИ ВАЖНЫЕ переменные среды
log Fatal не паникует. Он делает os.Exit
Знаю, но поведение схожее (хотя панику можна рекаверить, а вот выход - нельзя), потому и сказал мало ли что человек под паникой понимает
вот из нормальных причин мне самому кажется что отсутствие бд вполне норм, хотя я увидел где-то мнение что мол микросервис может и без бд работать и возвращать просто ошибки что бд нет. но вот чего-то другого я пока не уивдел
На самом деле ответ простой: там где невозможно возвращать ошибку. Это много где может быть: в миддлверах, горутинах и т. п. Где надо сказать что что-то пошло не так, но не знаешь как достучаться до системы. Еще пример, но он вообще не частый: при всяких очень оптимизированных вычислениях, например при математических перемножениях матриц и т.п. часто используют панику, потому что писать каждый раз err это долго дорого да и без толку
Если паника в горутине, поймать ее невозможно. Этот простой кейс и делает ее неприменимой.
recover в этом же горутине - все ловит
Окей, если горутину стартует не ваш код, а очередного вендора?
тогда он нарушил идиоматику го 🤣
расстреляли сынок (с)
Это всё ещё плохой кейс. Паника прервет выполнение всех горутин, как минимум невозможно сделать graceful shutdown. Сообщить системе о проблеме в обработке запроса должно быть можно в мидлваре через возврат ошибки или вызов логгера и прерывание цепочки запуска миддлварей.
Есть 2 проблемы) Когда вендор не использует стандарты языка (например игнорит конкуррентность и работает с мапкой без лока) или когда вендор берет на себя такие штуки как паниковать. Тут вы либо можете попасть на плохого вендора либо самому им стать
gshutdown должен выполнять по отмене контекста из мейна, а она, в свою очередь отменяться дефером в мейне.
Возвращаясь к предыдущему пункту - дефер в мейне не отловит паники в горутинах. Как минимум придется писать рековер в каждой горутине. Как максимум - если вендор стартует горутины - поймать панику в них невозможно
если ты про кейс с паникой, отдельные рекаверы не помогут. Если тебе надо упасть в го рутине, потому что там всё плохо, ты просто вызываешь панику и всё, тут с этим ничего не поделать. что касается миддверов, то там всегда первым добавляют миддлвер по отлову паник.
Если надо именно завершить всю программу без плюшек, то да, паника норм
Обсуждают сегодня