Итак, ранее мы узнали, что идиоматическим способом обработки аномальных условий в программе на 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 году.
Основное внимание в нем уделяется простоте, надежности и эффективности. Он был разработан, чтобы объединить эффективность, скорость и безопасность статически типизированного и компилируемого языка с легкостью…