From 5e2ce039131fd2075125ea07e0a6b7aadf7a8747 Mon Sep 17 00:00:00 2001 From: Gregory Eremin Date: Wed, 27 Jul 2016 00:05:22 +0200 Subject: [PATCH] Handle errors instead of interfaces --- daemon.go | 4 ++-- shezmu.go | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/daemon.go b/daemon.go index 24e0525..447b778 100644 --- a/daemon.go +++ b/daemon.go @@ -55,7 +55,7 @@ type BaseDaemon struct { } // PanicHandler is a function that handles panics. Duh! -type PanicHandler func(interface{}) +type PanicHandler func(error) // Process creates a task and then adds it to processing queue. func (d *BaseDaemon) Process(a Actor) { @@ -166,7 +166,7 @@ func (d *BaseDaemon) tryEnqueue(t *task) { d.queue <- t } -func (d *BaseDaemon) handlePanic(err interface{}) { +func (d *BaseDaemon) handlePanic(err error) { if d.panicHandler != nil { d.panicHandler(err) } diff --git a/shezmu.go b/shezmu.go index 0acb662..d9c706d 100644 --- a/shezmu.go +++ b/shezmu.go @@ -209,10 +209,11 @@ func (s *Shezmu) processSystemTask(t *task) { func (s *Shezmu) processGeneralTask(t *task) { defer func() { - if err := recover(); err != nil { + if val := recover(); val != nil { + err := interfaceToError(val) s.DaemonStats.Error(t.daemon.String()) t.daemon.base().handlePanic(err) - s.Logger.Printf("Daemon %s recovered from a panic\nError: %v\n", t.daemon, err) + s.Logger.Printf("Daemon %s recovered from a panic\nError: %s\n", t.daemon, err.Error()) debug.PrintStack() } }() @@ -227,3 +228,11 @@ func (s *Shezmu) processGeneralTask(t *task) { func (t *task) String() string { return fmt.Sprintf("%s[%s]", t.daemon, t.name) } + +func interfaceToError(val interface{}) error { + if terr, ok := val.(error); ok { + return terr + } + + return fmt.Errorf("%v", val) +}