mirror of
https://github.com/golang/go
synced 2024-11-22 07:14:40 -07:00
fmt: make all errors begin with the string "%!", always.
Fixes #5730. R=dsymonds, r, kamil.kisiel CC=golang-dev https://golang.org/cl/11998044
This commit is contained in:
parent
aa38aeaeaf
commit
53b61057b2
@ -156,8 +156,8 @@
|
||||
Printf("%*s", 4.5, "hi"): %!(BADWIDTH)hi
|
||||
Printf("%.*s", 4.5, "hi"): %!(BADPREC)hi
|
||||
Invalid or invalid use of argument index: %!(BADINDEX)
|
||||
Printf("%*[2]d", 7): %d!(BADINDEX)
|
||||
Printf("%.[2]d", 7): %d!(BADINDEX)
|
||||
Printf("%*[2]d", 7): %!d(BADINDEX)
|
||||
Printf("%.[2]d", 7): %!d(BADINDEX)
|
||||
|
||||
All errors begin with the string "%!" followed sometimes
|
||||
by a single character (the verb) and end with a parenthesized
|
||||
@ -169,9 +169,9 @@
|
||||
through the fmt package. For example, if a String method
|
||||
calls panic("bad"), the resulting formatted message will look
|
||||
like
|
||||
%s(PANIC=bad)
|
||||
%!s(PANIC=bad)
|
||||
|
||||
The %s just shows the print verb in use when the failure
|
||||
The %!s just shows the print verb in use when the failure
|
||||
occurred.
|
||||
|
||||
Scanning
|
||||
|
@ -563,17 +563,17 @@ var reorderTests = []struct {
|
||||
{"%d %d %d %#[1]o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015"},
|
||||
|
||||
// Erroneous cases.
|
||||
{"%[d", SE{2, 1}, "%d!(BADINDEX)"},
|
||||
{"%[d", SE{2, 1}, "%!d(BADINDEX)"},
|
||||
{"%]d", SE{2, 1}, "%!](int=2)d%!(EXTRA int=1)"},
|
||||
{"%[]d", SE{2, 1}, "%d!(BADINDEX)"},
|
||||
{"%[-3]d", SE{2, 1}, "%d!(BADINDEX)"},
|
||||
{"%[99]d", SE{2, 1}, "%d!(BADINDEX)"},
|
||||
{"%[]d", SE{2, 1}, "%!d(BADINDEX)"},
|
||||
{"%[-3]d", SE{2, 1}, "%!d(BADINDEX)"},
|
||||
{"%[99]d", SE{2, 1}, "%!d(BADINDEX)"},
|
||||
{"%[3]", SE{2, 1}, "%!(NOVERB)"},
|
||||
{"%[1].2d", SE{5, 6}, "%d!(BADINDEX)"},
|
||||
{"%[1]2d", SE{2, 1}, "%d!(BADINDEX)"},
|
||||
{"%3.[2]d", SE{7}, "%d!(BADINDEX)"},
|
||||
{"%.[2]d", SE{7}, "%d!(BADINDEX)"},
|
||||
{"%d %d %d %#[1]o %#o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015 %o!(MISSING)"},
|
||||
{"%[1].2d", SE{5, 6}, "%!d(BADINDEX)"},
|
||||
{"%[1]2d", SE{2, 1}, "%!d(BADINDEX)"},
|
||||
{"%3.[2]d", SE{7}, "%!d(BADINDEX)"},
|
||||
{"%.[2]d", SE{7}, "%!d(BADINDEX)"},
|
||||
{"%d %d %d %#[1]o %#o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015 %!o(MISSING)"},
|
||||
}
|
||||
|
||||
func TestReorder(t *testing.T) {
|
||||
@ -877,16 +877,16 @@ var panictests = []struct {
|
||||
}{
|
||||
// String
|
||||
{"%s", (*Panic)(nil), "<nil>"}, // nil pointer special case
|
||||
{"%s", Panic{io.ErrUnexpectedEOF}, "%s!(PANIC=unexpected EOF)"},
|
||||
{"%s", Panic{3}, "%s!(PANIC=3)"},
|
||||
{"%s", Panic{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
|
||||
{"%s", Panic{3}, "%!s(PANIC=3)"},
|
||||
// GoString
|
||||
{"%#v", (*Panic)(nil), "<nil>"}, // nil pointer special case
|
||||
{"%#v", Panic{io.ErrUnexpectedEOF}, "%v!(PANIC=unexpected EOF)"},
|
||||
{"%#v", Panic{3}, "%v!(PANIC=3)"},
|
||||
{"%#v", Panic{io.ErrUnexpectedEOF}, "%!v(PANIC=unexpected EOF)"},
|
||||
{"%#v", Panic{3}, "%!v(PANIC=3)"},
|
||||
// Format
|
||||
{"%s", (*PanicF)(nil), "<nil>"}, // nil pointer special case
|
||||
{"%s", PanicF{io.ErrUnexpectedEOF}, "%s!(PANIC=unexpected EOF)"},
|
||||
{"%s", PanicF{3}, "%s!(PANIC=3)"},
|
||||
{"%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
|
||||
{"%s", PanicF{3}, "%!s(PANIC=3)"},
|
||||
}
|
||||
|
||||
func TestPanics(t *testing.T) {
|
||||
|
@ -16,20 +16,21 @@ import (
|
||||
// Some constants in the form of bytes, to avoid string overhead.
|
||||
// Needlessly fastidious, I suppose.
|
||||
var (
|
||||
commaSpaceBytes = []byte(", ")
|
||||
nilAngleBytes = []byte("<nil>")
|
||||
nilParenBytes = []byte("(nil)")
|
||||
nilBytes = []byte("nil")
|
||||
mapBytes = []byte("map[")
|
||||
missingBytes = []byte("!(MISSING)")
|
||||
badIndexBytes = []byte("!(BADINDEX)")
|
||||
panicBytes = []byte("!(PANIC=")
|
||||
extraBytes = []byte("%!(EXTRA ")
|
||||
irparenBytes = []byte("i)")
|
||||
bytesBytes = []byte("[]byte{")
|
||||
badWidthBytes = []byte("%!(BADWIDTH)")
|
||||
badPrecBytes = []byte("%!(BADPREC)")
|
||||
noVerbBytes = []byte("%!(NOVERB)")
|
||||
commaSpaceBytes = []byte(", ")
|
||||
nilAngleBytes = []byte("<nil>")
|
||||
nilParenBytes = []byte("(nil)")
|
||||
nilBytes = []byte("nil")
|
||||
mapBytes = []byte("map[")
|
||||
percentBangBytes = []byte("%!")
|
||||
missingBytes = []byte("(MISSING)")
|
||||
badIndexBytes = []byte("(BADINDEX)")
|
||||
panicBytes = []byte("(PANIC=")
|
||||
extraBytes = []byte("%!(EXTRA ")
|
||||
irparenBytes = []byte("i)")
|
||||
bytesBytes = []byte("[]byte{")
|
||||
badWidthBytes = []byte("%!(BADWIDTH)")
|
||||
badPrecBytes = []byte("%!(BADPREC)")
|
||||
noVerbBytes = []byte("%!(NOVERB)")
|
||||
)
|
||||
|
||||
// State represents the printer state passed to custom formatters.
|
||||
@ -660,7 +661,7 @@ func (p *pp) catchPanic(arg interface{}, verb rune) {
|
||||
// Nested panics; the recursion in printArg cannot succeed.
|
||||
panic(err)
|
||||
}
|
||||
p.buf.WriteByte('%')
|
||||
p.buf.Write(percentBangBytes)
|
||||
p.add(verb)
|
||||
p.buf.Write(panicBytes)
|
||||
p.panicking = true
|
||||
@ -1165,12 +1166,12 @@ func (p *pp) doPrintf(format string, a []interface{}) {
|
||||
continue
|
||||
}
|
||||
if !p.goodArgNum {
|
||||
p.buf.WriteByte('%')
|
||||
p.buf.Write(percentBangBytes)
|
||||
p.add(c)
|
||||
p.buf.Write(badIndexBytes)
|
||||
continue
|
||||
} else if argNum >= len(a) { // out of operands
|
||||
p.buf.WriteByte('%')
|
||||
p.buf.Write(percentBangBytes)
|
||||
p.add(c)
|
||||
p.buf.Write(missingBytes)
|
||||
continue
|
||||
|
Loading…
Reference in New Issue
Block a user