Обработка паники в процедурах Go
Go предоставляет встроенные функции Panic() и Recovery() для управления неожиданными ошибками и фатальными ситуациями в работающий код. Чтобы справиться с паникой в программе go, важно понимать область действия функции восстановления().
Понимание области действия функции восстановления()
recover() может восстанавливаться только после паники внутри той же горутины, которая вызвала панику. Если в горутине без активного восстановления() возникает паника, вся программа выйдет из строя.
Пример с неправильной обработкой ошибок
Приведенный пример кода в вопросе не может обработать панику, поскольку в основной подпрограмме определена функция восстановления(), а в горутине handle() определена паника. В результате функция восстановления() не может получить доступ к значению паники.
func main() { // ... go handle(done) // ... } func handle(done chan int64) { // ... fmt.Println(*a) // Panic here doneПример с правильной обработкой ошибок
Чтобы обрабатывать панику, возникающую в горутине, поместите функцию восстановления() внутри самой горутины.
func main() { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() go handle(done) // ... } func handle(done chan int64) { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() fmt.Println(*a) // Panic here doneОбъяснение
В этом исправленном примере функция восстановления() теперь находится внутри горутины handle(), поэтому она может улавливать панику, возникающую при разыменовании нулевого указателя. Затем паника восстанавливается, и выводится сообщение «Восстановлено».
Понимание области действия Recovery() имеет решающее значение для эффективной обработки ошибок в процедурах Go. Всегда размещайте функцию восстановления() в той же горутине, где может возникнуть паника, чтобы корректно обрабатывать и сообщать о любых непредвиденных ситуациях.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3