From 7ac2032aabb0a7db1f2388b64995a13a4f13e0df Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Fri, 4 Sep 2020 16:10:17 +0800 Subject: [PATCH 1/2] Add an option to print args with default verbs Signed-off-by: Neil Shen --- terror_error.go | 15 ++++++++++++++- terror_test/terror_test.go | 9 +++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/terror_error.go b/terror_error.go index ad48c99..64c2fce 100644 --- a/terror_error.go +++ b/terror_error.go @@ -61,7 +61,8 @@ type Error struct { codeText ErrCodeText // message is a template of the description of this error. // printf-style formatting is enabled. - message string + message string + defaultFmt bool // The workaround field: how to work around this error. // It's used to teach the users how to solve the error if occurring in the real environment. workaround string @@ -126,6 +127,12 @@ func (e *Error) Error() string { func (e *Error) GetMsg() string { if len(e.args) > 0 { + if e.defaultFmt { + args := make([]interface{}, 0, 1+len(e.args)) + args = append(args, e.message+": ") + args = append(args, e.args...) + return fmt.Sprint(args...) + } return fmt.Sprintf(e.message, e.args...) } return e.message @@ -340,6 +347,12 @@ func MySQLErrorCode(code int) NormalizeOption { } } +func MessageDefaultFormat() NormalizeOption { + return func(e *Error) { + e.defaultFmt = true + } +} + // Normalize creates a new Error object. func Normalize(message string, opts ...NormalizeOption) *Error { e := &Error{ diff --git a/terror_test/terror_test.go b/terror_test/terror_test.go index eecd9e9..987194c 100644 --- a/terror_test/terror_test.go +++ b/terror_test/terror_test.go @@ -162,3 +162,12 @@ func (*testTErrorSuite) TestWarpAndField(c *C) { errWithWarpedCause := errors.Annotate(ErrGetLeader, causeErr.Error()) c.Assert(errWithWarpedCause.Error(), Equals, "load from etcd meet error: [member:ErrGetLeader]fail to get leader") } + +func (*testTErrorSuite) TestMessageDefaultFormat(c *C) { + causeErr := errors.New("load from etcd meet error") + ErrGetLeader := errors.Normalize("fail to get leader", errors.RFCCodeText("member:ErrGetLeader"), errors.MessageDefaultFormat()) + errAnnotate := errors.Annotate(ErrGetLeader, causeErr.Error()) + c.Assert(errAnnotate.Error(), Equals, "load from etcd meet error: [member:ErrGetLeader]fail to get leader") + errFastGenByArgs := ErrGetLeader.FastGenByArgs(causeErr.Error()) + c.Assert(errFastGenByArgs.Error(), Equals, "[member:ErrGetLeader]fail to get leader: load from etcd meet error") +} From 6645dcbd94fbde170d16f0434fd0d4bee4297b83 Mon Sep 17 00:00:00 2001 From: Neil Shen Date: Fri, 4 Sep 2020 17:38:27 +0800 Subject: [PATCH 2/2] terror: add default format verbs option Signed-off-by: Neil Shen --- terror_error.go | 4 ++++ terror_test/terror_test.go | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/terror_error.go b/terror_error.go index 64c2fce..4a8826b 100644 --- a/terror_error.go +++ b/terror_error.go @@ -154,6 +154,8 @@ func (e *Error) fillLineAndFile(skip int) { func (e *Error) GenWithStack(format string, args ...interface{}) error { err := *e err.message = format + // Always enable printf style message. + err.defaultFmt = false err.args = args err.fillLineAndFile(1) return AddStack(&err) @@ -172,6 +174,8 @@ func (e *Error) GenWithStackByArgs(args ...interface{}) error { func (e *Error) FastGen(format string, args ...interface{}) error { err := *e err.message = format + // Always enable printf style message. + err.defaultFmt = false err.args = args return SuspendStack(&err) } diff --git a/terror_test/terror_test.go b/terror_test/terror_test.go index 987194c..563b75f 100644 --- a/terror_test/terror_test.go +++ b/terror_test/terror_test.go @@ -166,8 +166,13 @@ func (*testTErrorSuite) TestWarpAndField(c *C) { func (*testTErrorSuite) TestMessageDefaultFormat(c *C) { causeErr := errors.New("load from etcd meet error") ErrGetLeader := errors.Normalize("fail to get leader", errors.RFCCodeText("member:ErrGetLeader"), errors.MessageDefaultFormat()) + errAnnotate := errors.Annotate(ErrGetLeader, causeErr.Error()) c.Assert(errAnnotate.Error(), Equals, "load from etcd meet error: [member:ErrGetLeader]fail to get leader") + errFastGenByArgs := ErrGetLeader.FastGenByArgs(causeErr.Error()) c.Assert(errFastGenByArgs.Error(), Equals, "[member:ErrGetLeader]fail to get leader: load from etcd meet error") + + errFastGen := ErrGetLeader.FastGen("caused by: %s", causeErr.Error()) + c.Assert(errFastGen.Error(), Equals, "[member:ErrGetLeader]caused by: load from etcd meet error") }