2
0
mirror of https://github.com/hibiken/asynq.git synced 2026-06-14 07:56:58 +08:00

Protect handler call against panic

This commit is contained in:
Ken Hibino
2019-11-27 14:03:04 -08:00
parent 47e2a57d05
commit d4f136ebc9
2 changed files with 68 additions and 1 deletions

View File

@@ -88,7 +88,7 @@ func (p *processor) exec() {
}
<-p.sema // release token
}()
err := p.handler(task) // TODO(hibiken): maybe also handle panic?
err := perform(p.handler, task)
if err != nil {
retryTask(p.rdb, msg, err)
}
@@ -103,3 +103,15 @@ func (p *processor) restore() {
log.Printf("[ERROR] could not move tasks from %q to %q\n", inProgress, defaultQueue)
}
}
// perform calls the handler with the given task.
// If the call returns without panic, it simply returns the value,
// otherwise, it recovers from panic and returns an error.
func perform(handler TaskHandler, task *Task) (err error) {
defer func() {
if x := recover(); x != nil {
err = fmt.Errorf("panic: %v", x)
}
}()
return handler(task)
}