Как правило, вам не нужно сильно беспокоиться о панике. Обычно они представляют собой два класса ошибок: ошибки разработчика (нулевые ссылки, выход за границы массива) и ошибки системного уровня, с которыми вы, вероятно, мало что можете поделать (например, нехватка памяти).
Как говорили другие, socket.Close
не будет паниковать, а вернет ошибку. Если вы сделаете:
defer socket.Close()
Ошибка сбрасывается и больше ничего делать не нужно.
Но предположим, что вы действительно хотите оправиться от паники. Если ваш обработчик восстановления отложен первым, вам больше ничего не нужно делать:
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
defer panic("this will be recovered")
}
Отложенные функции выполняются в обратном порядке: http://golang.org/ref/spec#Defer_statements.
Отложенные функции выполняются непосредственно перед возвратом из окружающей функции, в порядке, обратном их отложенному выполнению.
person
Caleb
schedule
10.12.2013