golang实现封装trycatch异常处理

老外的分享
复制代码
package main

import (
    "reflect"
)

type TryCatch struct {
    errChan      chan interface{}
    catches      map[reflect.Type]func(err error)
    defaultCatch func(err error)
}

func (t TryCatch) Try(block func()) TryCatch {
    t.errChan = make(chan interface{})
    t.catches = map[reflect.Type]func(err error){}
    t.defaultCatch = func(err error) {}
    go func() {
        defer func() {
            t.errChan <- recover()
        }()
        block()
    }()
    return t
}

func (t TryCatch) CatchAll(block func(err error)) TryCatch {
    t.defaultCatch = block
    return t
}

func (t TryCatch) Catch(e error, block func(err error)) TryCatch {
    errorType := reflect.TypeOf(e)
    t.catches[errorType] = block
    return t
}

func (t TryCatch) Finally(block func()) TryCatch {
    err := <-t.errChan
    if err != nil {
        catch := t.catches[reflect.TypeOf(err)]
        if catch != nil {
            catch(err.(error))
        } else {
            t.defaultCatch(err.(error))
        }
    }
    block()
    return t
}

type MyError struct {
    error
}

func main() {
    TryCatch{}.Try(func() {
        println("do something buggy")
        panic(MyError{})
    }).Catch(MyError{}, func(err error) {
        println("catch MyError")
    }).CatchAll(func(err error) {
        println("catch error")
    }).Finally(func() {
        println("finally do something")
    })
    println("done")
}
复制代码

本文转自:https://xiaorui.cc/archives/4674

posted @   ppjj  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-06-07 用java实现数字签名的原理
2020-06-07 nginx路径详解
2020-06-07 负载均衡
2020-06-07 http中消息头的安全配置及工作原理
2020-06-07 Tomcat的ErrorPage实现原理分析及阀门ErrorReportValve
2020-06-07 Tomcat中Logger组件
2020-06-07 NIO在Tomcat中的应用
点击右上角即可分享
微信分享提示