gopkg/try/catch.go
2021-07-24 23:54:34 +08:00

91 lines
2.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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)
}
}