Вебинар: Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики! - 26.08
Анализатор обнаружил использование функции recover в анонимной функции, которая сразу же будет вызвана. Таким образом, при возникновении паники невозможно восстановить исполнение горутины.
Рассмотрим синтетический пример:
func foo() {
func() {
if r := recover(); r != nil {
fmt.Println("Recovered", r)
}
}()
q, r := bits.Div64(hi, lo, y)
....
}
После определения анонимной функции и её вызова происходит вызов функции bits.Div64. Эта функция может вызвать панику, если y окажется равной 0. Если паника дойдет до верха стека, то программа аварийно завершится.
Для восстановления после возникновения паники должна быть использована функция recover. Однако функция recover будет вызвана до возникновения потенциальной паники, потому что определена в анонимной функции, которая будет сразу же вызвана. Поэтому восстановления не произойдёт.
Можно исправить код, сделав вызов анонимной функции отложенным с помощью ключевого слова defer:
func foo() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered", r)
}
}()
q, r := bits.Div64(hi, lo, y)
}
Была ли полезна эта страница документации?
Мы ответим вам на:
Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок: