Я только что прочитал этот пост об Panic/Recover in Go, и я не понимаю, как это отличается от try/catch в другие основные языки.
Паника восстанавливается в Go vs .s. попытаться поймать на других языках
Ответ 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 хочет сделать ваш метод только одним делом, любое исключение должно заставить эту вещь не продолжать. и поскольку паника должна после отсрочки, она заставит вас обработать свое "исключение" перед ее использованием.
Это просто понимание самого себя.