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

Обработка исключений на языке Google Go

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

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

4b9b3361

Ответ 1

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

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

Дизайнеры

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

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

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

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

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

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

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

  • idiomatic Go style - использовать коды ошибок, чтобы сообщить вызывающему об ошибках
  • используйте panic/recover только в редких случаях:
    • для "краха" вашей программы, когда вы сталкиваетесь с внутренней несогласованностью, указывающей на ошибки в вашем коде. Это в основном отладочная помощь.
    • если он значительно упрощает обработку ошибок в вашем коде (но если код должен использоваться другими, никогда не выставляйте такие паники вызывающим абонентам)

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