]> Cypherpunks repositories - gostls13.git/commit
text/template: recover panics during function calls
authorDaniel Martí <mvdan@mvdan.cc>
Thu, 18 Oct 2018 09:53:44 +0000 (10:53 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Wed, 24 Oct 2018 09:09:21 +0000 (09:09 +0000)
commit202e9031444cef93c16a97cf076e5f8a9d9c3a75
tree1dcd4dca0ad7c38228141c454ba8d107faeb5afb
parent980340ade7acb057c2e0e244a4002c96274f8a77
text/template: recover panics during function calls

There's precedent in handling panics that happen in functions called
from the standard library. For example, if a fmt.Formatter
implementation fails, fmt will absorb the panic into the output text.

Recovering panics is useful, because otherwise one would have to wrap
some Template.Execute calls with a recover. For example, if there's a
chance that the callbacks may panic, or if part of the input data is nil
when it shouldn't be.

In particular, it's a common confusion amongst new Go developers that
one can call a method on a nil receiver. Expecting text/template to
error on such a call, they encounter a long and confusing panic if the
method expects the receiver to be non-nil.

To achieve this, introduce safeCall, which takes care of handling error
returns as well as recovering panics. Handling panics in the "call"
function isn't strictly necessary, as that func itself is run via
evalCall. However, this makes the code more consistent, and can allow
for better context in panics via the "call" function.

Finally, add some test cases with a mix of funcs, methods, and func
fields that panic.

Fixes #28242.

Change-Id: Id67be22cc9ebaedeb4b17fa84e677b4b6e09ec67
Reviewed-on: https://go-review.googlesource.com/c/143097
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
src/text/template/exec.go
src/text/template/exec_test.go
src/text/template/funcs.go