паника / восстановление - это моральный эквивалент исключений "попытка / отлов".Существует поверхностное различие (синтаксис) и тонкое, но важное различие в предполагаемом использовании.
Лучшим объяснением проблем с исключениями в целом является «Чище, элегантнее, неправильно» иэто хороший обзор плюсов и минусов исключений в сравнении с возвратом кодов ошибок.
Разработчики Go решили, что обработка ошибок путем возврата кодов ошибок из функций - это идиоматический способ Go, и язык поддерживает множественные возвращаемые значения, чтобы сделать его синтаксическилегко.Хотя предусмотрена паника / восстановление, разница не в функциональности, а в предполагаемом использовании.
Другие языки, раскрывающие исключения, способствуют их использованию, и на практике они используются часто (иногда даже неправильно).
Goпрепятствует использованию паники / восстановления.Вы можете сделать это, но вы должны делать это только в очень ограниченных сценариях.
Если вы посмотрите на собственную стандартную библиотеку Go, большинство использует панику для сигнализации о фатальных ошибках, указываялибо внутренняя ошибка (т. е. ошибка) в коде библиотеки, либо вызов библиотеки с неверными данными (например, передача не-json-данных в функции декодирования json).
Но в статье, на которую вы ссылались, указано:В библиотеках Go существует соглашение о том, что даже когда пакет использует внутреннюю панику, его внешний API все еще предоставляет явные возвращаемые значения ошибок. "
Это отличается от языков, таких как C #, Java, Python или C ++, где многостандартный код библиотеки может выдавать исключения для ошибок сигнала.Эти языки хотят, чтобы вы использовали исключения.Go не рекомендует использовать панику / восстановление.
Подводя итог:
- Идиоматический стиль Go заключается в использовании кодов ошибок для сообщения вызывающей стороне об ошибках
- использование паники /восстанавливайте только в редких случаях:
- , чтобы «вывести из строя» вашу программу при обнаружении внутренней несогласованности, указывающей на ошибки в вашем коде.По сути, это средство отладки.
- , если оно значительно упрощает обработку ошибок в вашем коде (но если код должен использоваться другими, никогда не подвергайте вызывающих таких панике вызывающим)
На практике важно использовать идиоматический стиль языка.В Go это возвращает коды ошибок и избегает паники / восстановления.В C # это использует исключения, чтобы сигнализировать о некоторых ошибках.