From d0bb3a401300847d2e86df2c441b26d44901f10f Mon Sep 17 00:00:00 2001 From: Mikael Ganehag Brorsson Date: Thu, 2 Sep 2021 18:59:34 +0200 Subject: [PATCH 1/2] Handle panics by deferring recover as an error --- script.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/script.go b/script.go index 46e48029..0bd1fe97 100644 --- a/script.go +++ b/script.go @@ -219,6 +219,11 @@ func (c *Compiled) RunContext(ctx context.Context) (err error) { v := NewVM(c.bytecode, c.globals, c.maxAllocs) ch := make(chan error, 1) go func() { + defer func() { + if r, ok := recover().(error); ok { + ch <- r + } + }() ch <- v.Run() }() From 49c3e7593e70a332dd87a1f1551036bce40de4f8 Mon Sep 17 00:00:00 2001 From: Mikael Ganehag Brorsson Date: Sun, 5 Sep 2021 10:19:34 +0200 Subject: [PATCH 2/2] Check for type in recover handler --- script.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/script.go b/script.go index 0bd1fe97..627bb95f 100644 --- a/script.go +++ b/script.go @@ -220,8 +220,15 @@ func (c *Compiled) RunContext(ctx context.Context) (err error) { ch := make(chan error, 1) go func() { defer func() { - if r, ok := recover().(error); ok { - ch <- r + if r := recover(); r != nil { + switch e := r.(type) { + case string: + ch <- fmt.Errorf(e) + case error: + ch <- e + default: + ch <- fmt.Errorf("unknown panic: %v", e) + } } }() ch <- v.Run()