Обработка исключений на языке Google Go - PullRequest
29 голосов
/ 26 августа 2011

Мне интересно ... Я читал о Go некоторое время назад, и я пытался что-то запрограммировать в нем.Мне кажется, довольно интересно.Но я достиг обработки «исключений» на этом языке .Я прочитал об их подходе, и это кажется разумным.Я хотел бы знать, каковы преимущества стандартного исключительного подхода перед стилем Go?Каковы плюсы и минусы?

Редактировать Проще говоря: я не хочу вести священную войну с исключениями.Мне просто интересно, имеет ли этот стиль обработки ошибок какие-либо преимущества?Каковы реальные преимущества этого стиля перед стандартными исключениями?Стоит ли вообще удивляться?

1 Ответ

51 голосов
/ 26 августа 2011

паника / восстановление - это моральный эквивалент исключений "попытка / отлов".Существует поверхностное различие (синтаксис) и тонкое, но важное различие в предполагаемом использовании.

Лучшим объяснением проблем с исключениями в целом является «Чище, элегантнее, неправильно» иэто хороший обзор плюсов и минусов исключений в сравнении с возвратом кодов ошибок.

Разработчики Go решили, что обработка ошибок путем возврата кодов ошибок из функций - это идиоматический способ Go, и язык поддерживает множественные возвращаемые значения, чтобы сделать его синтаксическилегко.Хотя предусмотрена паника / восстановление, разница не в функциональности, а в предполагаемом использовании.

Другие языки, раскрывающие исключения, способствуют их использованию, и на практике они используются часто (иногда даже неправильно).

Goпрепятствует использованию паники / восстановления.Вы можете сделать это, но вы должны делать это только в очень ограниченных сценариях.

Если вы посмотрите на собственную стандартную библиотеку Go, большинство использует панику для сигнализации о фатальных ошибках, указываялибо внутренняя ошибка (т. е. ошибка) в коде библиотеки, либо вызов библиотеки с неверными данными (например, передача не-json-данных в функции декодирования json).

Но в статье, на которую вы ссылались, указано:В библиотеках Go существует соглашение о том, что даже когда пакет использует внутреннюю панику, его внешний API все еще предоставляет явные возвращаемые значения ошибок. "

Это отличается от языков, таких как C #, Java, Python или C ++, где многостандартный код библиотеки может выдавать исключения для ошибок сигнала.Эти языки хотят, чтобы вы использовали исключения.Go не рекомендует использовать панику / восстановление.

Подводя итог:

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

На практике важно использовать идиоматический стиль языка.В Go это возвращает коды ошибок и избегает паники / восстановления.В C # это использует исключения, чтобы сигнализировать о некоторых ошибках.

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