Пройти курс: Паника и восстановление

Итак, ранее мы узнали, что идиоматическим способом обработки аномальных условий в программе на Go является использование ошибок. Хотя ошибок достаточно для большинства случаев, есть некоторые ситуации, когда программа не может продолжать работу.

В этих случаях мы можем использовать встроенную функцию panic.

Panic

func panic(interface{})
Войти в полноэкранный режим Выход из полноэкранного режима

Паника — это встроенная функция, которая останавливает нормальное выполнение текущей goroutine. Когда функция вызывает panic, нормальное выполнение функции немедленно прекращается, и управление возвращается обратно вызывающей функции. Это повторяется до тех пор, пока программа не завершится с сообщением о панике и трассировкой стека.

Примечание: Мы обсудим горутины позже в этом курсе.

Итак, давайте посмотрим, как можно использовать функцию panic.

package main

func main() {
    WillPanic()
}

func WillPanic() {
    panic("Woah")
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Если мы запустим это, то увидим panic в действии.

$ go run main.go
panic: Woah

goroutine 1 [running]:
main.WillPanic(...)
        .../main.go:8
main.main()
        .../main.go:4 +0x38
exit status 2
Вход в полноэкранный режим Выход из полноэкранного режима

Как и ожидалось, наша программа вывела сообщение о панике, затем трассировку стека, а затем завершилась.

Итак, вопрос в том, что делать, когда происходит неожиданная паника?

Восстановить

Ну, можно восстановить контроль над паникующей программой с помощью встроенной функции recover, а также ключевого слова defer.

func recover() interface{}
Вход в полноэкранный режим Выход из полноэкранного режима

Давайте попробуем на примере создать функцию handlePanic. А затем вызовем ее с помощью defer.

package main

import "fmt"

func main() {
    WillPanic()
}

func handlePanic() {
    data := recover()
    fmt.Println("Recovered:", data)
}

func WillPanic() {
    defer handlePanic()

    panic("Woah")
}
Вход в полноэкранный режим Выход из полноэкранного режима
$ go run main.go
Recovered: Woah
Войти в полноэкранный режим Выход из полноэкранного режима

Как мы видим, наша паника была восстановлена, и теперь наша программа может продолжить выполнение.

Наконец, я упомяну, что panic и recover можно считать аналогичными идиомам try/catch в других языках. Но есть один важный фактор: мы должны избегать panic и recover и использовать ошибки, когда это возможно.

Если это так, то это подводит нас к вопросу, когда мы должны использовать panic?

Случаи использования

Есть два правильных случая использования panic:

  • Неисправимая ошибка

Это может быть ситуация, когда программа не может просто продолжить выполнение.

Например, чтение конфигурационного файла, который важен для запуска программы, поскольку в случае сбоя чтения файла больше ничего нельзя сделать.

  • Ошибка разработчика

Это наиболее распространенная ситуация. Например, разыменование указателя, когда его значение равно nil, приведет к панике.


Эта статья является частью моего открытого курса по Go, доступного на Github.

karanpratapsingh / go-course

Освойте основы и расширенные возможности языка программирования Go

Курс по Go

Привет, добро пожаловать на курс, и спасибо за изучение Go. Я надеюсь, что этот курс обеспечит вам отличный опыт обучения.

Этот курс также доступен на моем сайте, а также на Educative.io

Оглавление

  • Начало работы

    • Что такое Go?
    • Зачем изучать Go?
    • Установка и настройка
  • Глава I

    • Hello World
    • Переменные и типы данных
    • Форматирование строк
    • Управление потоком данных
    • Функции
    • Модули
    • Пакеты
    • Рабочие пространства
    • Полезные команды
    • Сборка
  • Глава II

    • Указатели
    • Структуры
    • Методы
    • Массивы и фрагменты
    • Карты
  • Глава III

    • Интерфейсы
    • Ошибки
    • Паника и восстановление
    • Тестирование
    • Дженерики
  • Глава IV

    • Параллелизм
    • Гороутины
    • Каналы
    • Выбрать
    • Пакет синхронизации
    • Расширенные шаблоны параллелизма
    • Контекст
  • Приложение

    • Следующие шаги
    • Ссылки

Что такое Go?

Go (также известный как Golang) — это язык программирования, разработанный в Google в 2007 году и открытый в 2009 году.

Основное внимание в нем уделяется простоте, надежности и эффективности. Он был разработан, чтобы объединить эффективность, скорость и безопасность статически типизированного и компилируемого языка с легкостью…

Посмотреть на GitHub

Оцените статью
devanswers.ru
Добавить комментарий