Подтвердить что ты не робот

Паника восстанавливается в Go vs .s. попытаться поймать на других языках

Я только что прочитал этот пост об Panic/Recover in Go, и я не понимаю, как это отличается от try/catch в другие основные языки.

4b9b3361

Ответ 1

Я продолжаю смотреть на этот вопрос, пытаясь придумать лучший способ ответить на него. Легче всего просто указать на идиоматические применения для паники/восстановления, в отличие от try/catch & | исключений на других языках или понятий, лежащих в основе этих идиом (которые можно в основном суммировать как "исключения должны происходить только в действительно исключительных обстоятельствах" )

Но какова фактическая разница между ними? Я постараюсь обобщить как можно лучше.

Одним из основных различий по сравнению с блоками try/catch является способ управления потоками. В типичном сценарии try/catch код после блока catch будет выполняться, если он не распространяет ошибку. Это не так с паникой/восстановлением. Паника прерывает текущую функцию и начинает раскручивать стек, запуская отложенные функции (единственное место, где происходит восстановление, что-либо), когда он сталкивается с ними.

На самом деле, я бы это сделал еще дальше: panic/recover почти ничего не значит, как try/catch в том смысле, что try и catch (или, по крайней мере, действуют как) структуры управления, а panic/recover не являются.

Это действительно связано с тем, что восстановление построено вокруг механизма отсрочки, который (насколько я могу судить) является довольно уникальной концепцией в Go.

Есть, конечно, больше, что я добавлю, если я могу немного улучшить мои мысли.

Ответ 2

Паника/Восстановление - это область действия. Это похоже на то, что вам разрешен только один блок try/catch в каждой функции, и попытка должна покрыть всю функцию. Это очень раздражает использование Panic/Recover так же, как использование java/python/С# и т.д. Исключений. Это намеренно. Это также побуждает людей использовать Panic/Recover таким образом, чтобы он был предназначен для использования. Вы должны восстановить() из паники(), а затем вернуть значение ошибки вызывающему.

Ответ 3

defer - механизм не только для обработки ошибок, но и для удобной и контролируемой очистки. Теперь паника работает как raise() на других языках. С помощью функции recover() у вас есть возможность поймать эту панику, пока она поднимается вверх по стеке вызовов. Таким образом, это почти похоже на try/catch. Но пока последний работает над блоками panic/recover работает на уровне функции.

Роб Пайк о причине этого решения: "Мы не хотим поощрять смешивание ошибок и исключений, возникающих на таких языках, как Java". Вместо того, чтобы иметь большое количество различных исключений с еще большим количеством способов использования, нужно делать все, чтобы избежать ошибок времени выполнения, доставлять правильные значения возврата ошибки после определения и использовать panic/recover, только если нет другого способа.

Ответ 4

Я думаю, мы все согласны с тем, что panic есть throw, recover is catch, а defer - finally.

Большая разница кажется, что recover входит внутрь defer. Возвращаясь к традиционным терминам, он позволяет вам точно определить, в какой точке вашего finally вы хотите беспокоить catch что-либо или вообще не использовать.

Ответ 5

Я думаю, что паника такая же, как и бросок, Recover - это то же самое, что и улов. Разница заключается в отсрочке. В начале, я думаю, что отсрочка такая же, как в конце концов, но позже я считаю, что отсрочка более гибкая, чем в конце. defer может быть размещен в любой области вашей функции и запомнить значение параметра в этот момент, а также может изменить возвращаемое возвращаемое значение, паника может быть в любом месте после отсрочки. но из-за отсутствия блока try мы не можем обработать "исключение", если не вернется вся функция. Я не думаю, что это недостаток, возможно, GO хочет сделать ваш метод только одним делом, любое исключение должно заставить эту вещь не продолжать. и поскольку паника должна после отсрочки, она заставит вас обработать свое "исключение" перед ее использованием.

Это просто понимание самого себя.