﻿# V8007\. Calling the 'recover' function inside the anonymous function that is not deferred will not recover execution from panic\.

Анализатор обнаружил использование функции recover в анонимной функции, которая сразу же будет вызвана\. Таким образом, при возникновении паники невозможно восстановить исполнение горутины\.

Рассмотрим синтетический пример:

```cpp
func foo() {
  func() {
    if r := recover(); r != nil {
      fmt.Println("Recovered", r)
    }
  }()
  q, r := bits.Div64(hi, lo, y)
  ....
}
```

После определения анонимной функции и её вызова происходит вызов функции `bits.Div64`\. Эта функция может вызвать панику, если `y` окажется равной `0`\. Если паника дойдет до верха стека, то программа аварийно завершится\.

Для восстановления после возникновения паники должна быть использована функция [`recover`](https://go.dev/ref/spec#Handling_panics)\. Однако функция `recover` будет вызвана до возникновения потенциальной паники, потому что определена в анонимной функции, которая будет сразу же вызвана\. Поэтому восстановления не произойдёт\.

Можно исправить код, сделав вызов анонимной функции отложенным с помощью ключевого слова `defer`:

```cpp
func foo() {
  defer func() {
    if r := recover(); r != nil {
      fmt.Println("Recovered", r)
    }
  }()
  q, r := bits.Div64(hi, lo, y)
}
```