Open
Description
At the moment, the code is:
// safeCall runs fun.Call(args), and returns the resulting value and error, if
// any. If the call panics, the panic value is returned as an error.
func safeCall(fun reflect.Value, args []reflect.Value) (val reflect.Value, err error) {
defer func() {
if r := recover(); r != nil {
if e, ok := r.(error); ok {
err = e
} else {
err = fmt.Errorf("%v", r)
}
}
}()
ret := fun.Call(args)
if len(ret) == 2 && !ret[1].IsNil() {
return ret[0], ret[1].Interface().(error)
}
return ret[0], nil
}
If the function in template panics: {{.TheUnstableFunc}}
, users and developers only know that it panics, but there is no stracktrace.
In a complex system, the template functions could also be complex, without stacktrace, it's difficult to locate the root problem.
It's really helpful to provide a full stacktrace when the template function panics.
We have encounters a related bug today, the TheUnstableFunc
has concurrency bug, template package only reports runtime error: slice bounds out of range [2:1]
, it costs a lot of time for debugging the bug.
Thank you.