Функция recover

Функция recover предназначена для восстановления после панической ситуации. Она вызывается внутри отложенной функции (defer) и возвращает значение, переданное в функцию panic. Если паники не было, recover возвращает nil. Основное назначение этой функции — предотвращение аварийного завершения программы и корректная обработка исключительных ситуаций.

Синтаксис

gorecover() interface{}

Функция не принимает параметров и возвращает результат типа interface{}, который может быть любого типа.

Пример

Давайте рассмотрим базовый пример использования recover для перехвата паники:

gopackage 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")
}

Результат выполнения кода:

go"Recovered from panic: something went wrong"

Пример

Рассмотрим случай, когда паника не произошла — recover возвращает nil:

gopackage 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")
}

Результат выполнения кода:

go"Program is running normally"
"No panic occurred"

Пример

Покажем, как recover может использоваться для обработки паники в отдельной горутине:

gopackage 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")
}

Результат выполнения кода:

go"Worker recovered from: worker panic"
"Main program continues"

Смотрите также

  • функцию panic,
    которая инициирует паническую ситуацию
  • инструкцию defer,
    которая откладывает выполнение функции до завершения окружающей
  • инструкцию return,
    которая возвращает значение из функции
  • пустой идентификатор blank identifier,
    который используется для игнорирования значений