Паника выздоравливает в Go v.s. попробуйте поймать на других языках - PullRequest
33 голосов
/ 05 августа 2010

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

Ответы [ 5 ]

21 голосов
/ 27 августа 2010

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

19 голосов
/ 07 августа 2010

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

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

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

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

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

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

9 голосов
/ 05 августа 2010

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

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

6 голосов
/ 18 июня 2015

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

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

2 голосов
/ 26 июля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...