91 lines
2.0 KiB
Go
91 lines
2.0 KiB
Go
|
// 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)
|
|||
|
}
|
|||
|
}
|