yjp 3 anni fa
parent
commit
323775aa21
2 ha cambiato i file con 35 aggiunte e 21 eliminazioni
  1. 32 18
      errors.go
  2. 3 3
      errors_test.go

+ 32 - 18
errors.go

@@ -1,9 +1,9 @@
 package fserr
 
 import (
-	"errors"
 	"fmt"
-	pkgerrors "github.com/pkg/errors"
+	"github.com/pkg/errors"
+	"io"
 )
 
 const (
@@ -41,11 +41,7 @@ func TransferFromError(err error) *Error {
 		return transferErr
 	}
 
-	return &Error{
-		code:    ErrUnknownCode,
-		message: err.Error(),
-		error:   pkgerrors.New(err.Error()),
-	}
+	return NewUnknownError(err.Error())
 }
 
 func NewUnknownError(message string) *Error {
@@ -77,9 +73,9 @@ func NewCustomError(message string) *Error {
 }
 
 type Error struct {
-	code    uint32
-	message string
-	error
+	code         uint32
+	message      string
+	StackMessage string
 }
 
 func (err *Error) Code() uint32 {
@@ -87,15 +83,14 @@ func (err *Error) Code() uint32 {
 }
 
 func (err *Error) Error() string {
-	errMsg := fmt.Sprintf("%+v\n", err.error)
-	return errMsg
+	return err.message
 }
 
 func (err *Error) WithStack() error {
 	return &Error{
-		code:    err.code,
-		message: err.message,
-		error:   pkgerrors.New(err.message),
+		code:         err.code,
+		message:      err.message,
+		StackMessage: formStackMessage(err.message),
 	}
 }
 
@@ -108,10 +103,29 @@ func (err *Error) Is(target error) bool {
 	return err.message == transferErr.message && err.code == transferErr.code
 }
 
+func (err *Error) Format(s fmt.State, verb rune) {
+	switch verb {
+	case 'v':
+		if s.Flag('+') {
+			io.WriteString(s, err.StackMessage)
+			return
+		}
+		fallthrough
+	case 's':
+		io.WriteString(s, err.message)
+	case 'q':
+		fmt.Fprintf(s, "%q", err.message)
+	}
+}
+
 func newError(code uint32, message string) *Error {
 	return &Error{
-		code:    code,
-		message: message,
-		error:   errors.New(message),
+		code:         code,
+		message:      message,
+		StackMessage: formStackMessage(message),
 	}
 }
+
+func formStackMessage(message string) string {
+	return fmt.Sprintf("\n%+v\n", errors.New(message))
+}

+ 3 - 3
errors_test.go

@@ -9,12 +9,12 @@ import (
 var testErr = newError(ErrUnknownCode, "测试错误")
 
 func TestErrors(t *testing.T) {
-	fmt.Println("测试错误打印:", testErr)
+	fmt.Printf("测试错误打印: %+v\n", testErr)
 
 	Func1()
 
 	err := testErr.WithStack()
-	fmt.Println("测试WithStack错误打印:", err)
+	fmt.Printf("测试WithStack错误打印: %+v\n", err)
 
 	isRight := errors.Is(err, testErr)
 	if !isRight {
@@ -27,7 +27,7 @@ func TestErrors(t *testing.T) {
 		t.Fatal("As错误")
 	}
 
-	fmt.Println("测试目标错误打印:", targetErr)
+	fmt.Printf("测试目标错误打印: %+v\n", targetErr)
 
 	if !errors.Is(err, targetErr) {
 		t.Fatal("目标错误和原始错误不一致")