Вы правы, код, который вы разместили, никогда не должен паниковать и, следовательно, "сбивать" программу.
В качестве лучшей практики, чтобы гарантировать, что // code here
также не делает этого, "оберните" егов функции (анонимной или именованной), и используйте recover()
(отложено!) в этом.Это гарантирует, что задание опроса также никогда не «завершит работу» планировщика опроса.
Примерно так:
func (p *Poller) StartPoller() {
ticker := time.NewTicker(3 * time.Second)
defer ticker.Stop()
for {
<-ticker.C
func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered: %v", r)
}
}()
// code here
// If this would panic, it will be recovered...
}()
}
}
И даже если опрашивающее устройство всегда будет работать, я бы все равнодобавить к нему канал «отключения», дающий возможность постепенного завершения:
func (p *Poller) StartPoller(shutdown <-chan struct{}) {
ticker := time.NewTicker(3 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
case <-shutdown:
return
}
func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered: %v", r)
}
}()
// code here
// If this would panic, it will be recovered...
}()
}
}