Функция recover
Функция recover предназначена для восстановления после панической ситуации.
Она вызывается внутри отложенной функции (defer) и возвращает значение,
переданное в функцию panic. Если паники не было, recover возвращает
nil. Основное назначение этой функции — предотвращение аварийного
завершения программы и корректная обработка исключительных ситуаций.
Синтаксис
recover() interface{}
Функция не принимает параметров и возвращает результат типа
interface{}, который может быть любого типа.
Пример
Давайте рассмотрим базовый пример использования recover
для перехвата паники:
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
panic("something went wrong")
fmt.Println("This line will not be executed")
}
Результат выполнения кода:
"Recovered from panic: something went wrong"
Пример
Рассмотрим случай, когда паника не произошла — recover
возвращает nil:
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
} else {
fmt.Println("No panic occurred")
}
}()
fmt.Println("Program is running normally")
}
Результат выполнения кода:
"Program is running normally"
"No panic occurred"
Пример
Покажем, как recover может использоваться для
обработки паники в отдельной горутине:
package main
import (
"fmt"
"time"
)
func safeWorker() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Worker recovered from:", r)
}
}()
panic("worker panic")
}
func main() {
go safeWorker()
time.Sleep(100 * time.Millisecond)
fmt.Println("Main program continues")
}
Результат выполнения кода:
"Worker recovered from: worker panic"
"Main program continues"
Смотрите также
-
функцию
panic,
которая инициирует паническую ситуацию -
инструкцию
defer,
которая откладывает выполнение функции до завершения окружающей -
инструкцию
return,
которая возвращает значение из функции -
пустой идентификатор
blank identifier,
который используется для игнорирования значений