Что такое идиоматический способ обработки ошибок, произошедших глубоко в слоях программы? Если у меня есть такой фрагмент кода где-то глубоко внутри упаковки:Куда «выходить (1)» и куда возвращать ошибку?
file, err := os.Open(path)
if err != nil {
os.Exit(1) // or return errors.New("The path is invalid.")
}
Должен ли я вернуть ошибку и, возможно, перетащить его через несколько слоев с if {} else {}
блоков до main
и Exit
в main
или Exit
сразу?
С немедленным Exit
код выглядит более чистым и читаемым. Но иногда это трудно проверить. С возвратом и проверкой код выглядит хуже (по моему мнению), но его легче тестировать и достигать 100% охвата.
И еще один вопрос ... Если я пишу пакет, и он не имеет функции main
, я должен оставить Exit
s программе «пользователь» и просто вернуть ошибки?