Skip to content

Commit c3b9a72

Browse files
fmt: include failing method name in panic message
Fixes #25707 Change-Id: Idfa379db8cc0e105ea68455ec0b4a0dbc1b3f485 Reviewed-on: https://go-review.googlesource.com/c/153827 Run-TryBot: Ian Lance Taylor <[email protected]> Reviewed-by: Rob Pike <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 9ce38f5 commit c3b9a72

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

src/fmt/fmt_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,18 +1683,18 @@ var panictests = []struct {
16831683
}{
16841684
// String
16851685
{"%s", (*PanicS)(nil), "<nil>"}, // nil pointer special case
1686-
{"%s", PanicS{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
1687-
{"%s", PanicS{3}, "%!s(PANIC=3)"},
1686+
{"%s", PanicS{io.ErrUnexpectedEOF}, "%!s(PANIC=String method: unexpected EOF)"},
1687+
{"%s", PanicS{3}, "%!s(PANIC=String method: 3)"},
16881688
// GoString
16891689
{"%#v", (*PanicGo)(nil), "<nil>"}, // nil pointer special case
1690-
{"%#v", PanicGo{io.ErrUnexpectedEOF}, "%!v(PANIC=unexpected EOF)"},
1691-
{"%#v", PanicGo{3}, "%!v(PANIC=3)"},
1690+
{"%#v", PanicGo{io.ErrUnexpectedEOF}, "%!v(PANIC=GoString method: unexpected EOF)"},
1691+
{"%#v", PanicGo{3}, "%!v(PANIC=GoString method: 3)"},
16921692
// Issue 18282. catchPanic should not clear fmtFlags permanently.
1693-
{"%#v", []interface{}{PanicGo{3}, PanicGo{3}}, "[]interface {}{%!v(PANIC=3), %!v(PANIC=3)}"},
1693+
{"%#v", []interface{}{PanicGo{3}, PanicGo{3}}, "[]interface {}{%!v(PANIC=GoString method: 3), %!v(PANIC=GoString method: 3)}"},
16941694
// Format
16951695
{"%s", (*PanicF)(nil), "<nil>"}, // nil pointer special case
1696-
{"%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
1697-
{"%s", PanicF{3}, "%!s(PANIC=3)"},
1696+
{"%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=Format method: unexpected EOF)"},
1697+
{"%s", PanicF{3}, "%!s(PANIC=Format method: 3)"},
16981698
}
16991699

17001700
func TestPanics(t *testing.T) {

src/fmt/print.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ func (p *pp) fmtPointer(value reflect.Value, verb rune) {
538538
}
539539
}
540540

541-
func (p *pp) catchPanic(arg interface{}, verb rune) {
541+
func (p *pp) catchPanic(arg interface{}, verb rune, method string) {
542542
if err := recover(); err != nil {
543543
// If it's a nil pointer, just say "<nil>". The likeliest causes are a
544544
// Stringer that fails to guard against nil or a nil pointer for a
@@ -561,6 +561,8 @@ func (p *pp) catchPanic(arg interface{}, verb rune) {
561561
p.buf.WriteString(percentBangString)
562562
p.buf.WriteRune(verb)
563563
p.buf.WriteString(panicString)
564+
p.buf.WriteString(method)
565+
p.buf.WriteString(" method: ")
564566
p.panicking = true
565567
p.printArg(err, 'v')
566568
p.panicking = false
@@ -577,7 +579,7 @@ func (p *pp) handleMethods(verb rune) (handled bool) {
577579
// Is it a Formatter?
578580
if formatter, ok := p.arg.(Formatter); ok {
579581
handled = true
580-
defer p.catchPanic(p.arg, verb)
582+
defer p.catchPanic(p.arg, verb, "Format")
581583
formatter.Format(p, verb)
582584
return
583585
}
@@ -586,7 +588,7 @@ func (p *pp) handleMethods(verb rune) (handled bool) {
586588
if p.fmt.sharpV {
587589
if stringer, ok := p.arg.(GoStringer); ok {
588590
handled = true
589-
defer p.catchPanic(p.arg, verb)
591+
defer p.catchPanic(p.arg, verb, "GoString")
590592
// Print the result of GoString unadorned.
591593
p.fmt.fmtS(stringer.GoString())
592594
return
@@ -604,13 +606,13 @@ func (p *pp) handleMethods(verb rune) (handled bool) {
604606
switch v := p.arg.(type) {
605607
case error:
606608
handled = true
607-
defer p.catchPanic(p.arg, verb)
609+
defer p.catchPanic(p.arg, verb, "Error")
608610
p.fmtString(v.Error(), verb)
609611
return
610612

611613
case Stringer:
612614
handled = true
613-
defer p.catchPanic(p.arg, verb)
615+
defer p.catchPanic(p.arg, verb, "String")
614616
p.fmtString(v.String(), verb)
615617
return
616618
}

0 commit comments

Comments
 (0)