增加try-cache
This commit is contained in:
parent
8c67426f0f
commit
34349a0b06
90
try/catch.go
Normal file
90
try/catch.go
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
// Package try...
|
||||||
|
//
|
||||||
|
// Description : catch 的实现
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-07-24 10:10 下午
|
||||||
|
package try
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
// CatchHandler catch的处理
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 9:55 下午 2021/7/24
|
||||||
|
type CatchHandler struct {
|
||||||
|
err error // 异常
|
||||||
|
hasDeal bool // 是否已处理
|
||||||
|
}
|
||||||
|
|
||||||
|
// NeedDeal 是否需要处理 : 存在异常切异常没有处理过
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 9:57 下午 2021/7/24
|
||||||
|
func (ch *CatchHandler) NeedDeal() bool {
|
||||||
|
return nil != ch.err && !ch.hasDeal
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasError 判断是否有异常
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:00 下午 2021/7/24
|
||||||
|
func (ch *CatchHandler) HasError() bool {
|
||||||
|
return ch.err != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorHasDeal 异常已经处理
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:01 下午 2021/7/24
|
||||||
|
func (ch *CatchHandler) ErrorHasDeal() bool {
|
||||||
|
return ch.hasDeal
|
||||||
|
}
|
||||||
|
|
||||||
|
// Catch ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:29 下午 2021/7/24
|
||||||
|
func (ch *CatchHandler) Catch(err error, handler func(err2 error)) ICatchHandler {
|
||||||
|
if !ch.NeedDeal() {
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
//如果传入的error类型和发生异常的类型一致,则执行异常处理器,并将hasCatch修改为true代表已捕捉异常
|
||||||
|
if reflect.TypeOf(err) == reflect.TypeOf(ch.err) {
|
||||||
|
handler(ch.err)
|
||||||
|
ch.hasDeal = true
|
||||||
|
}
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
// CatchAll ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:29 下午 2021/7/24
|
||||||
|
func (ch *CatchHandler) CatchAll(handler func(err error)) FinalHandler {
|
||||||
|
if !ch.NeedDeal() {
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
handler(ch.err)
|
||||||
|
ch.hasDeal = true
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ch *CatchHandler) Finally(handlers ...func()) {
|
||||||
|
// 遍历处理器,并在Finally函数执行完毕之后执行
|
||||||
|
for _, handler := range handlers {
|
||||||
|
defer handler()
|
||||||
|
}
|
||||||
|
err := ch.err
|
||||||
|
//<7>如果异常不为空,且未捕捉异常,则抛出异常
|
||||||
|
if err != nil && !ch.hasDeal {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
130
try/iTry.go
Normal file
130
try/iTry.go
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
// Package try...
|
||||||
|
//
|
||||||
|
// Description : 各种接口定义
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-07-24 9:47 下午
|
||||||
|
package try
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/go-developer/gopkg/easymap"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ICatchHandler catch处理
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:12 下午 2021/7/24
|
||||||
|
type ICatchHandler interface {
|
||||||
|
Catch(e error, handler func(err error)) ICatchHandler
|
||||||
|
CatchAll(handler func(err error)) FinalHandler
|
||||||
|
FinalHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
// SystemError 系统异常
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 11:35 下午 2021/7/24
|
||||||
|
type SystemError struct {
|
||||||
|
error
|
||||||
|
}
|
||||||
|
|
||||||
|
// FinalHandler final处理
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:12 下午 2021/7/24
|
||||||
|
type FinalHandler interface {
|
||||||
|
Finally(handlers ...func())
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithNormal 入口try函数, 普通的逻辑
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:43 下午 2021/7/24
|
||||||
|
func WithNormal(f func()) ICatchHandler {
|
||||||
|
t := &CatchHandler{}
|
||||||
|
defer func() {
|
||||||
|
defer func() {
|
||||||
|
r := recover()
|
||||||
|
if r != nil {
|
||||||
|
switch r.(type) {
|
||||||
|
case runtime.Error:
|
||||||
|
t.err = r.(error)
|
||||||
|
case error:
|
||||||
|
t.err = r.(error)
|
||||||
|
case string, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64:
|
||||||
|
t.err = SystemError{SystemError{error: errors.New(fmt.Sprintf("%v", r))}}
|
||||||
|
default:
|
||||||
|
byteData, _ := json.Marshal(r)
|
||||||
|
t.err = SystemError{error: errors.New(string(byteData))}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
f()
|
||||||
|
}()
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithGin 带 gin context 的 try, 可集成gin框架
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:50 下午 2021/7/24
|
||||||
|
func WithGin(ctx *gin.Context, f func(ctx *gin.Context)) ICatchHandler {
|
||||||
|
t := &CatchHandler{}
|
||||||
|
defer func() {
|
||||||
|
defer func() {
|
||||||
|
r := recover()
|
||||||
|
t.err = r.(error)
|
||||||
|
}()
|
||||||
|
f(ctx)
|
||||||
|
}()
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithData 带数据的try
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:52 下午 2021/7/24
|
||||||
|
func WithData(data easymap.EasyMap, f func(data easymap.EasyMap)) ICatchHandler {
|
||||||
|
t := &CatchHandler{}
|
||||||
|
defer func() {
|
||||||
|
defer func() {
|
||||||
|
r := recover()
|
||||||
|
if r != nil {
|
||||||
|
t.err = r.(error)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
f(data)
|
||||||
|
}()
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithInterface 传入任意数据类型
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:53 下午 2021/7/24
|
||||||
|
func WithInterface(data interface{}, f func(data interface{})) ICatchHandler {
|
||||||
|
t := &CatchHandler{}
|
||||||
|
defer func() {
|
||||||
|
defer func() {
|
||||||
|
r := recover()
|
||||||
|
if r != nil {
|
||||||
|
t.err = r.(error)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
f(data)
|
||||||
|
}()
|
||||||
|
return t
|
||||||
|
}
|
31
try/iTry_test.go
Normal file
31
try/iTry_test.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Package try...
|
||||||
|
//
|
||||||
|
// Description : try...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<张德满>
|
||||||
|
//
|
||||||
|
// Date : 2021-07-24 11:15 下午
|
||||||
|
package try
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestWithNormal ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 11:16 下午 2021/7/24
|
||||||
|
func TestWithNormal(t *testing.T) {
|
||||||
|
f := func() {
|
||||||
|
var m *url.URL
|
||||||
|
fmt.Println(m.RawQuery)
|
||||||
|
}
|
||||||
|
WithNormal(f).CatchAll(func(err error) {
|
||||||
|
fmt.Println("捕获异常 :" + err.Error())
|
||||||
|
}).Finally(func() {
|
||||||
|
fmt.Println("这里是final")
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user