Prechádzať zdrojové kódy

去除部分panic校验

jys 2 rokov pred
rodič
commit
9eb64662c6
9 zmenil súbory, kde vykonal 116 pridanie a 16 odobranie
  1. 46 1
      README.md
  2. 3 0
      go.mod
  3. 11 0
      go.sum
  4. 15 5
      v2alpha/center.go
  5. 1 1
      v2alpha/center_test.go
  6. 1 1
      v2alpha/code.go
  7. 2 0
      v2alpha/compatible.go
  8. 12 7
      v2alpha/public.go
  9. 25 1
      v2alpha/public_test.go

+ 46 - 1
README.md

@@ -1,3 +1,48 @@
 # fserr
 
-方是错误封装
+方是错误封装
+
+# v2alpha版本更新
+
+## 特性
+1. 采用6位错误码定位具体错误类型,并根据错误类型给出更加具体的错误信息;
+2. 用户无感知的栈信息;
+3. 兼容主流错误风格及api,高度可替换性。
+
+## 快速开始
+
+```go
+package main
+
+import (
+	"fmt"
+	"git.sxidc.com/service-supports/fserr/v2alpha"
+)
+
+const (
+	ErrProjectNotExist = iota + 201
+)
+
+func init() {
+	// 设置服务码
+	fserr.SetAppCode(10)
+
+	// fserr包内置错误码
+	fserr.NewOK(fserr.ErrDb, "处理失败,请联系开发人员")
+
+	// 业务模块错误
+	fserr.NewOK(ErrProjectNotExist, "项目不存在")
+}
+
+func Add() error {
+	return fserr.WithCode(nil, ErrProjectNotExist)
+}
+
+func main() {
+	err := Add()
+	if err != nil {
+		fmt.Printf("%+v\n", fserr.ParseCode(err))
+		return
+	}
+}
+```

+ 3 - 0
go.mod

@@ -5,10 +5,13 @@ go 1.20
 require (
 	github.com/pkg/errors v0.9.1
 	github.com/stretchr/testify v1.8.3
+	go.uber.org/zap v1.24.0
 )
 
 require (
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
+	go.uber.org/atomic v1.7.0 // indirect
+	go.uber.org/multierr v1.6.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )

+ 11 - 0
go.sum

@@ -1,11 +1,22 @@
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
 github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
+go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

+ 15 - 5
v2alpha/center.go

@@ -1,23 +1,33 @@
 package fserr
 
 import (
+	"go.uber.org/zap"
 	"net/http"
 	"sync"
 )
 
 var codeMap sync.Map
 
+var logger *zap.Logger
+
 var defaultErrCode = ErrCode{
 	HttpCode: http.StatusOK,
 }
 
-func register(business int, code ErrCode) {
-	_, ok := codeMap.Load(business)
-	if ok {
-		panic("duplicate business code")
+func init() {
+	var err error
+	logger, err = zap.NewProduction()
+	if err != nil {
+		panic(err)
 	}
+}
 
-	codeMap.Store(business, code)
+func register(code ErrCode) {
+	if _, ok := codeMap.Load(code.BusinessCode); ok {
+		logger.Warn("duplicate business code", zap.Int("business", code.BusinessCode),
+			zap.String("message", code.Message))
+	}
+	codeMap.Store(code.BusinessCode, code)
 }
 
 func getCode(business int) ErrCode {

+ 1 - 1
v2alpha/center_test.go

@@ -13,7 +13,7 @@ type TestCenterSuite struct {
 
 func (s *TestCenterSuite) SetupTest() {
 	s.expectedBusinessCode = 1001
-	register(s.expectedBusinessCode, NewOK(s.expectedBusinessCode, "ok"))
+	register(NewOK(s.expectedBusinessCode, "ok"))
 }
 
 func (s *TestCenterSuite) TestGetCenterErrCode() {

+ 1 - 1
v2alpha/code.go

@@ -43,7 +43,7 @@ func SetDefault(httpCode, businessCode int, message string) {
 // NewCode 创建指定信息的错误码
 func NewCode(httpCode, businessCode int, message string) ErrCode {
 	code := ErrCode{httpCode, serviceCode + businessCode, message}
-	register(businessCode, code)
+	register(code)
 	return code
 }
 

+ 2 - 0
v2alpha/compatible.go

@@ -1,5 +1,7 @@
 package fserr
 
+// TransferFromError 将错误转为带栈帧的错误
+// Deprecated 请使用 New、 Wrap、 WithCode
 func TransferFromError(err error) error {
 	return withStack{
 		error: err,

+ 12 - 7
v2alpha/public.go

@@ -3,6 +3,8 @@ package fserr
 import (
 	"errors"
 	"fmt"
+	"strconv"
+	"strings"
 )
 
 // New 创建新的错误,支持格式化占位符
@@ -35,7 +37,7 @@ func Wrap(err error, format string, args ...any) error {
 // WithCode 创建带有错误码的error,支持格式化占位符
 // 使用option可以替换其中信息
 func WithCode[T codeType](err error, businessCode T, options ...Option) error {
-	code := getCode(int(businessCode))
+	code := getCode(serviceCode + int(businessCode))
 	ret := &withCode{
 		cause:        wrapStack(err),
 		Msg:          code.Message,
@@ -116,11 +118,17 @@ func IsCode[T codeType](err error, code T) bool {
 	return target.BusinessCode == int(code)
 }
 
-// SetServiceCode 设置服务错误码
+// SetAppCode 设置服务错误码
 // 例如设置服务码为300000,用户不存在错误码为2001,
 // 那么最终业务错误码为302001
-func SetServiceCode[T codeType](code T) {
-	serviceCode = int(code)
+func SetAppCode[T codeType](code T) {
+	strCode := strconv.Itoa(int(code))
+	c, err := strconv.ParseInt(strCode+strings.Repeat("0", 6-len(strCode)),
+		10, 64)
+	if err != nil {
+		panic(err)
+	}
+	serviceCode = int(c)
 }
 
 // outerMsg 获取最外层的错误信息
@@ -141,9 +149,6 @@ func outerMsg(err error) string {
 }
 
 func wrapStack(err error) error {
-	if err == nil {
-		return nil
-	}
 	if _, ok := err.(*fundamental); ok {
 		return err
 	}

+ 25 - 1
v2alpha/public_test.go

@@ -2,6 +2,7 @@ package fserr
 
 import (
 	"errors"
+	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/suite"
 	"net/http"
 	"testing"
@@ -117,7 +118,7 @@ func (s *TestPublicSuite) TestIsCode() {
 }
 
 func (s *TestPublicSuite) TestSetServiceCode() {
-	SetServiceCode(300000)
+	SetAppCode(300000)
 	NewOK(2001, "ok")
 	err := WithCode(nil, 2001)
 	s.Equal(302001, ParseCode(err).BusinessCode)
@@ -126,3 +127,26 @@ func (s *TestPublicSuite) TestSetServiceCode() {
 func TestPublic(t *testing.T) {
 	suite.Run(t, &TestPublicSuite{})
 }
+
+func TestServiceCode(t *testing.T) {
+	SetAppCode(10)
+	NewBadRequest(ErrDb, "db error")
+	code := ParseCode(WithCode(nil, ErrDb))
+	assert.Equal(t, "db error", code.Msg)
+	assert.Equal(t, 100102, code.BusinessCode)
+	assert.Equal(t, http.StatusBadRequest, code.HttpCode)
+
+	SetAppCode(100000)
+	NewInternalError(ErrParam, "param error")
+	code = ParseCode(WithCode(nil, ErrParam))
+	assert.Equal(t, "param error", code.Msg)
+	assert.Equal(t, 100103, code.BusinessCode)
+	assert.Equal(t, http.StatusInternalServerError, code.HttpCode)
+
+	SetAppCode(1000)
+	NewConflict(ErrRetry, "retry error")
+	code = ParseCode(WithCode(nil, ErrRetry))
+	assert.Equal(t, 100104, code.BusinessCode)
+	assert.Equal(t, http.StatusConflict, code.HttpCode)
+	assert.Equal(t, "retry error", code.Msg)
+}