2017-01-28 6 views
0

Что такое идиоматический способ обработки ошибок, произошедших глубоко в слоях программы? Если у меня есть такой фрагмент кода где-то глубоко внутри упаковки:Куда «выходить (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 программе «пользователь» и просто вернуть ошибки?

ответ

1

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