170 похожих чатов

Коллеги, в каких случаях все-таки кошерно использовать панику вместо эрроров?

17 ответов

22 просмотра

Ни в каких

Я б сказал только в main при инициализации. И то через log.Fatal. А ля: падай, если нету базы данных, или отсутствуют КРИТИЧЕСКИ ВАЖНЫЕ переменные среды

Elmanov Anton
log Fatal не паникует. Он делает os.Exit

Знаю, но поведение схожее (хотя панику можна рекаверить, а вот выход - нельзя), потому и сказал мало ли что человек под паникой понимает

Dmitry-Belyaev Автор вопроса
Johnny
Я б сказал только в main при инициализации. И то ч...

вот из нормальных причин мне самому кажется что отсутствие бд вполне норм, хотя я увидел где-то мнение что мол микросервис может и без бд работать и возвращать просто ошибки что бд нет. но вот чего-то другого я пока не уивдел

На самом деле ответ простой: там где невозможно возвращать ошибку. Это много где может быть: в миддлверах, горутинах и т. п. Где надо сказать что что-то пошло не так, но не знаешь как достучаться до системы. Еще пример, но он вообще не частый: при всяких очень оптимизированных вычислениях, например при математических перемножениях матриц и т.п. часто используют панику, потому что писать каждый раз err это долго дорого да и без толку

Johnny
Знаю, но поведение схожее (хотя панику можна рекав...

Если паника в горутине, поймать ее невозможно. Этот простой кейс и делает ее неприменимой.

Александр Попов
recover в этом же горутине - все ловит

Окей, если горутину стартует не ваш код, а очередного вендора?

Заур Ашурбеков
На самом деле ответ простой: там где невозможно во...

Это всё ещё плохой кейс. Паника прервет выполнение всех горутин, как минимум невозможно сделать graceful shutdown. Сообщить системе о проблеме в обработке запроса должно быть можно в мидлваре через возврат ошибки или вызов логгера и прерывание цепочки запуска миддлварей.

Александр Попов
расстреляли сынок (с)

Есть 2 проблемы) Когда вендор не использует стандарты языка (например игнорит конкуррентность и работает с мапкой без лока) или когда вендор берет на себя такие штуки как паниковать. Тут вы либо можете попасть на плохого вендора либо самому им стать

Elmanov Anton
Это всё ещё плохой кейс. Паника прервет выполнение...

gshutdown должен выполнять по отмене контекста из мейна, а она, в свою очередь отменяться дефером в мейне.

Заур Ашурбеков
gshutdown должен выполнять по отмене контекста из ...

Возвращаясь к предыдущему пункту - дефер в мейне не отловит паники в горутинах. Как минимум придется писать рековер в каждой горутине. Как максимум - если вендор стартует горутины - поймать панику в них невозможно

Elmanov Anton
Возвращаясь к предыдущему пункту - дефер в мейне н...

если ты про кейс с паникой, отдельные рекаверы не помогут. Если тебе надо упасть в го рутине, потому что там всё плохо, ты просто вызываешь панику и всё, тут с этим ничего не поделать. что касается миддверов, то там всегда первым добавляют миддлвер по отлову паник.

Заур Ашурбеков
если ты про кейс с паникой, отдельные рекаверы не ...

Если надо именно завершить всю программу без плюшек, то да, паника норм

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта