cpp

Функция recover(): обработка паники

Панику можно обработать внутри отложенной функции и восстановить нормальное выполнение программы. Для этого предназначена глобальная функция recover(). Формат функции:

recover() interface{}

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

Пример обработки деления на ноль приведен в листинге 13.2.

Листинг 13.2. Функция recover(): обработка паники

package main

import "fmt"

func main() {
   fmt.Println(division(10, 2))
   fmt.Println(division(10, 0))
   fmt.Println("Выполнение программы продолжается!")
}
func division(x, y int) (n int) {
   defer func() {
      if r := recover(); r != nil {
         fmt.Println(r)
         n = 0 // Возвращаем из функции division() ноль
      }
   }()
   fmt.Println("Инструкция до деления")
   n = x / y
   fmt.Println("Инструкция после деления")
   return
}

Запустим программу и посмотрим на результат:

C:\book\test>go run main.go
Инструкция до деления
Инструкция после деления
5
Инструкция до деления
runtime error: integer divide by zero
0
Выполнение программы продолжается!

Обратите внимание, что при втором вызове функции division() инструкция:

fmt.Println("Инструкция после деления")

не выполняется. При возникновении паники управление сразу передается в отложенную функцию. После выхода из отложенной функции происходит выход из функции division() и программа продолжает выполняться дальше.

Если мы уберем инструкцию defer, то результат будет таким:

C:\book\test>go run main.go
Инструкция до деления
Инструкция после деления
5
Инструкция до деления
panic: runtime error: integer divide by zero

goroutine 1 [running]:
main.division(0xa, 0x0)
        C:/book/test/main.go:12 +0xe5
main.main()
        C:/book/test/main.go:7 +0x71
exit status 2

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp