补充业务异常
This commit is contained in:
parent
a76b596a7d
commit
d3caa05b7a
@ -189,12 +189,12 @@ func (l *Log) Logger() *zerolog.Logger {
|
||||
// 带上中间信息Any
|
||||
// book/controller/book.go:60
|
||||
root := zerolog.New(io.MultiWriter(writers...)).With().Timestamp().Any("服务", "book-api")
|
||||
|
||||
if l.CallerDeep > 0 {
|
||||
zerolog.CallerMarshalFunc = l.CallerMarshalFunc
|
||||
// 启用caller
|
||||
root = root.Caller()
|
||||
// 配置自定义caller
|
||||
zerolog.CallerMarshalFunc = l.CallerMarshalFunc
|
||||
}
|
||||
|
||||
// 带有这些上下文信息的Logger对象 提前出来,作为全局Logger对象,供全局使用
|
||||
l.SetRoot(root.Logger().Level(l.Level))
|
||||
}
|
||||
|
@ -2,9 +2,11 @@ package controller
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
"gitlab.com/go-course-project/go17/book/config"
|
||||
"gitlab.com/go-course-project/go17/book/exception"
|
||||
"gitlab.com/go-course-project/go17/book/model"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
@ -42,8 +44,12 @@ func (c *BookController) GetBook(ctx context.Context, req *GetBookRequest) (*mod
|
||||
ins := &model.Book{}
|
||||
|
||||
if err := c.db.WithContext(ctx).Where("isbn = ?", req.Isbn).Take(ins).Error; err != nil {
|
||||
return nil, err
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return nil, exception.ErrNotFound("%d not found", req.Isbn)
|
||||
}
|
||||
return nil, fmt.Errorf("get book error, %s", err)
|
||||
}
|
||||
|
||||
return ins, nil
|
||||
}
|
||||
|
||||
|
@ -5,14 +5,25 @@ import (
|
||||
"testing"
|
||||
|
||||
"gitlab.com/go-course-project/go17/book/controller"
|
||||
"gitlab.com/go-course-project/go17/book/exception"
|
||||
"gitlab.com/go-course-project/go17/book/model"
|
||||
)
|
||||
|
||||
func TestGetBook(t *testing.T) {
|
||||
book := controller.NewBookController()
|
||||
ins, err := book.GetBook(context.Background(), &controller.GetBookRequest{
|
||||
Isbn: 5,
|
||||
Isbn: 100,
|
||||
})
|
||||
|
||||
if err != nil && exception.IsNotFound(err) {
|
||||
t.Log("is not found error")
|
||||
}
|
||||
// if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
// t.Log("is not found error")
|
||||
// }
|
||||
// if err.Error() == "record not found" {
|
||||
// t.Log(" string equal is not found error")
|
||||
// }
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
@ -1,3 +1,6 @@
|
||||
{"level":"debug","time":"2024-11-23T15:07:35+08:00","caller":"book/controller/book.go:60","message":"req 请求信息: {\n \"title\": \"Go语言\",\n \"author\": \"will\",\n \"price\": 10,\n \"is_sale\": null\n}"}
|
||||
{"level":"debug","time":"2024-11-23T15:11:42+08:00","caller":"book/controller/book.go:60","message":"req 请求信息: {\n \"title\": \"Go语言\",\n \"author\": \"will\",\n \"price\": 10,\n \"is_sale\": null\n}"}
|
||||
{"level":"debug","服务":"book-api","time":"2024-11-23T15:14:21+08:00","caller":"book/controller/book.go:60","message":"req 请求信息: {\n \"title\": \"Go语言\",\n \"author\": \"will\",\n \"price\": 10,\n \"is_sale\": null\n}"}
|
||||
{"level":"debug","服务":"book-api","time":"2024-11-23T15:24:12+08:00","caller":"book/controller/book.go:61","message":"req 请求信息: {\n \"title\": \"Go语言\",\n \"author\": \"will\",\n \"price\": 10,\n \"is_sale\": null\n}"}
|
||||
{"level":"debug","服务":"book-api","time":"2024-11-23T15:25:07+08:00","caller":"book/controller/book.go:61","message":"req 请求信息: {\n \"title\": \"Go语言\",\n \"author\": \"will\",\n \"price\": 10,\n \"is_sale\": null\n}"}
|
||||
{"level":"debug","服务":"book-api","time":"2024-11-23T15:34:19+08:00","caller":"/Users/yumaojun/Projects/go-course/go17/book/controller/book.go:61","message":"req 请求信息: {\n \"title\": \"Go语言\",\n \"author\": \"will\",\n \"price\": 10,\n \"is_sale\": null\n}"}
|
||||
|
38
book/exception/README.md
Normal file
38
book/exception/README.md
Normal file
@ -0,0 +1,38 @@
|
||||
# 业务异常
|
||||
|
||||
```go
|
||||
func TestGetBook(t *testing.T) {
|
||||
book := controller.NewBookController()
|
||||
ins, err := book.GetBook(context.Background(), &controller.GetBookRequest{
|
||||
Isbn: 100,
|
||||
})
|
||||
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
t.Log("is not found error")
|
||||
}
|
||||
if err.Error() == "record not found" {
|
||||
t.Log(" string equal is not found error")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(ins)
|
||||
}
|
||||
```
|
||||
|
||||
设立一种统一的业务异常机制, 业内最常见的 就是 定义业务异常Code
|
||||
|
||||
+ Code: 业务异常码
|
||||
+ Message: 异常的具体信息
|
||||
+ Reason: 导致这个异常的原因
|
||||
|
||||
业务异常是错误的一部分, 是一个error的一种实现
|
||||
|
||||
```go
|
||||
// The error built-in interface type is the conventional interface for
|
||||
// representing an error condition, with the nil value representing no error.
|
||||
type error interface {
|
||||
Error() string
|
||||
}
|
||||
```
|
19
book/exception/errors.go
Normal file
19
book/exception/errors.go
Normal file
@ -0,0 +1,19 @@
|
||||
package exception
|
||||
|
||||
import "fmt"
|
||||
|
||||
const (
|
||||
ERR_NOT_FOUND = 404
|
||||
)
|
||||
|
||||
func IsNotFound(err error) bool {
|
||||
if v, ok := (err).(*ApiExceptin); ok {
|
||||
return v.Code == ERR_NOT_FOUND
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func ErrNotFound(format string, a ...any) *ApiExceptin {
|
||||
return NewApiExceptin(ERR_NOT_FOUND, fmt.Sprintf(format, a...))
|
||||
}
|
21
book/exception/exception.go
Normal file
21
book/exception/exception.go
Normal file
@ -0,0 +1,21 @@
|
||||
package exception
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func NewApiExceptin(code int, message string) *ApiExceptin {
|
||||
return &ApiExceptin{
|
||||
Code: code,
|
||||
Message: message,
|
||||
}
|
||||
}
|
||||
|
||||
type ApiExceptin struct {
|
||||
Code int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
func (e *ApiExceptin) Error() string {
|
||||
return fmt.Sprintf("[%d] %s", e.Code, e.Message)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user