Я до сих пор избегал использования log.Fatal
, но недавно я случайно встретил эти вопросы; code-coverage и tests-using-log-fatal.Должен ли пакет Go когда-либо использовать log.Fatal и когда?
Одно из замечаний вопросов покрытия на 100 кодов говорит:
... В подавляющем большинстве случаев
log.Fatal
следует использовать только в основных, или инициализации функций (или, возможно, некоторые вещи, которые предназначены для можно назвать только непосредственно от них)»
Это идет мне думать, так что я начал смотреть на стандартном коде библиотеки снабженного Go. Есть много примеров, когда теста код в библиотеке использует log.Fatal
, который кажется прекрасным. несколько примеров вне тестового кода, например, в net/http
, как показано ниже:
// net/http/transport.go
func (t *Transport) putIdleConn(pconn *persistConn) bool {
...
for _, exist := range t.idleConn[key] {
if exist == pconn {
log.Fatalf("dup idle pconn %p in freelist", pconn)
}
}
...
}
Если его лучше практика, чтобы избежать использования log.Fatal
, почему он используется вообще в стандартных библиотеках, я бы ожидал просто верните ошибку. Для пользователя библиотеки кажется несправедливым вызывать os.Exit
и не дает возможности для очистки приложения.
Я могу быть наивным, поэтому мой вопрос, как лучший пример, может состоять в том, чтобы позвонить log.Panic
, который может быть восстановлен, и мое теоретическое долговременное стабильное приложение может иметь шанс подняться из пепла.
Итак, что лучше всего сказать для Go about when log.Fatal следует использовать?
Надеюсь, что этот код абсолютно недостижим. То, что ошибка, которая приводит к тому, что незанятое соединение остается в списке ожидания, а также используется как активное соединение, не должна быть чем-то, что должно происходить когда-либо, и для того, чтобы это произошло, должно быть что-то катастрофическое. Но поскольку они, похоже, правильно используют мьютексы вокруг списка простоя и т. Д., Я понятия не имею, почему этот цикл и код даже необходимы. Почему они будут дальше выходить из вашей программы, а не паниковать, это еще одна загадка. Отличный вопрос. – captncraig
Являются ли какие-либо из тестов в этом пакете доступными для этой линии? – captncraig
Хороший вопрос, немного поглядел и не мог видеть ничего похожего на его специально разработанное для достижения этой линии. Еще не окончательно ... – miltonb