首页 > 其他分享 >golang的try catch 方式

golang的try catch 方式

时间:2023-12-06 19:23:06浏览次数:31  
标签:try return err golang func error catch fn

列子如下 :main.go

 
 1 try.Catch(func(err error) {
 2     //异常处理
 3     fmt.Println(err)
 4 }).Then(func() error {
 5     //执行代码 1
 6     //...
 7 
 8     //如果有异常即抛出异常
 9     return nil
10 }).Then(func() error {
11     //执行代码 2
12     //...
13 
14     //如果有异常即抛出异常
15     return errors.New("出错啦")
16 }).Start(func() error {
17     //执行代码 2
18     //...上面所有的Then执行完成后才会执行ok
19     fmt.Println("OK")
20     //如果有异常即抛出异常
21     return nil
22 }, func() {
23     //无论是否成功都执行finally
24     fmt.Println("finally")
25 })

源码文件:try.go

  1 package try
  2 
  3 import (
  4     "errors"
  5     "regexp"
  6     "strings"
  7 )
  8 
  9 // Error 如果错误则执行fn
 10 func Error(err error, fn func(err error)) {
 11     if err != nil {
 12         fn(err)
 13     }
 14 }
 15 
 16 // ReturnError 如果错误直接返回错误,否则执行fn
 17 func ReturnError(err error, fn func() error) error {
 18     if err != nil {
 19         return err
 20     } else {
 21         return fn()
 22     }
 23 }
 24 func Length(value string, min, max int, message string) error {
 25     if !(len(value) >= min && len(value) <= max) {
 26         return errors.New(message)
 27     }
 28     return nil
 29 }
 30 func Pattern(value, pattern, message string) error {
 31     is, err := regexp.MatchString(pattern, value)
 32     if err != nil {
 33         return err
 34     }
 35     if is {
 36         return nil
 37     }
 38     return errors.New(message)
 39 }
 40 func Blank(value, message string) error {
 41     if strings.TrimSpace(value) == "" {
 42         return errors.New(message)
 43     }
 44     return nil
 45 }
 46 func Null(value any, message string) error {
 47     if value == nil {
 48         return errors.New(message)
 49     }
 50     return nil
 51 }
 52 func True(value bool, message string) error {
 53     if value {
 54         return errors.New(message)
 55     }
 56     return nil
 57 }
 58 func False(value bool, message string) error {
 59     if !value {
 60         return errors.New(message)
 61     }
 62     return nil
 63 }
 64 
 65 type Execute struct {
 66     catch func(err error)
 67     fns   []func() error
 68 }
 69 
 70 func Catch(catch func(err error)) *Execute {
 71     return &Execute{
 72         catch: catch,
 73         fns:   make([]func() error, 0),
 74     }
 75 }
 76 func (valid *Execute) Null(value any, message string) *Execute {
 77     valid.fns = append(valid.fns, func() error {
 78         return Null(value, message)
 79     })
 80     return valid
 81 }
 82 func (valid *Execute) True(value bool, message string) *Execute {
 83     valid.fns = append(valid.fns, func() error {
 84         return True(value, message)
 85     })
 86     return valid
 87 }
 88 func (valid *Execute) False(value bool, message string) *Execute {
 89     valid.fns = append(valid.fns, func() error {
 90         return False(value, message)
 91     })
 92     return valid
 93 }
 94 func (valid *Execute) Length(value string, min, max int, message string) *Execute {
 95     valid.fns = append(valid.fns, func() error {
 96         return Length(value, min, max, message)
 97     })
 98     return valid
 99 }
100 func (valid *Execute) Blank(value, message string) *Execute {
101     valid.fns = append(valid.fns, func() error {
102         return Blank(value, message)
103     })
104     return valid
105 }
106 func (valid *Execute) Pattern(value, pattern, message string) *Execute {
107     valid.fns = append(valid.fns, func() error {
108         return Pattern(value, pattern, message)
109     })
110     return valid
111 }
112 func (valid *Execute) Then(fn func() error) *Execute {
113     valid.fns = append(valid.fns, fn)
114     return valid
115 }
116 
117 // Run 有返回值error, ok所有方法执行成功然后才执行,finally 无法是否成功都执行
118 func (valid *Execute) Run(ok func() error, finally func()) error {
119     defer func() {
120         if finally != nil {
121             finally()
122         }
123     }()
124     var err error
125     for _, fn := range valid.fns {
126         err = fn()
127         if err != nil {
128             if valid.catch != nil {
129                 valid.catch(err)
130             }
131             return err
132         }
133     }
134     if ok != nil {
135         if err = ok(); err != nil {
136             if valid.catch != nil {
137                 valid.catch(err)
138             }
139         }
140     }
141     return nil
142 }
143 
144 // Start 无返回值,ok所有方法执行成功然后才执行,finally 无法是否成功都执行
145 func (valid *Execute) Start(ok func() error, finally func()) {
146     defer func() {
147         if finally != nil {
148             finally()
149         }
150     }()
151     var err error
152     for _, fn := range valid.fns {
153         err = fn()
154         if err != nil {
155             if valid.catch != nil {
156                 valid.catch(err)
157             }
158             return
159         }
160     }
161     if ok != nil {
162         if err = ok(); err != nil {
163             if valid.catch != nil {
164                 valid.catch(err)
165             }
166         }
167     }
168 }

 

 

标签:try,return,err,golang,func,error,catch,fn
From: https://www.cnblogs.com/liudongcai/p/17880326.html

相关文章

  • cerbos golang 内部policy check 处理简单说明
    主要是想尝试实现一个rust的check方法,所以先研究下golang的内部实现CheckResourcesfunc(cs*CerbosService)CheckResources(ctxcontext.Context,req*requestv1.CheckResourcesRequest)(*responsev1.CheckResourcesResponse,error){log:=logging.......
  • java中的try-with-resource语法
    java的世界千奇百怪。。。当我甩出如下代码段,不知阁下如何应对?try(Aa=newA()){和a变量无关的业务代码块}没错,这就是“臭名昭著”的try-with-resource语法,乍一看让人不知所云,其实它和try-finally的下述代码等价Aa=newA()try{//业务代码块}finally{a.clos......
  • 使用 Guava Retry 优雅的实现重试机制
    王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人大家好,我是王有志。今天我会通过一个真实的项目改造案例和大家聊一聊如何优雅的实现Java中常用的的重试机制。业务背景在我们的系统中当客户完成支付后,保单管理系统会通过MQ推送出一条包......
  • Linux搭建Docker Registry本地镜像仓库并且实现无公网远程上传本地镜像
    DockerRegistry本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pullorpush(拉取和推送)镜像,不受本地局域网限制!1.部署DockerRegistry使用官网安装方式,docker命令一键启动,该命令启动一个registry的容器,版本是2,挂载宿主机端口是5000端口,挂载后,5000端口就是我......
  • golang的蓝牙通信库
    github.com/tinygo-org/bluetooth:TinyGo是一个Go语言编译器,它专注于微控制器和小型计算机系统。这个库是TinyGo项目的一部分,用于支持蓝牙低功耗(BLE)设备。github.com/go-ble/ble:这是一个轻量级的Golang库,旨在简化与蓝牙低功耗设备的交互。它支持多种平台,并提供了一种简单的A......
  • docker仓库(hub、registry和harbor)
    1、docker仓库介绍Docker仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。Docker运行中使用的默认仓库是DockerHub公共仓库2、docker公有仓库和私有仓库的区别公有仓库:Docker官方提供一个公共仓库,称为Do......
  • golang之媒体处理
    [视频]获取视频封面图:1)如果是使用oss的话,可以添加指定的后缀生成指定图片  获取视频长度:1)若是oss上的视频,则可以使用阿里云的IMM中的提取视频信息的服务注意这里获取需要使用到签名之后获取对应的数据 这里使用基于阿里云oss包: github.com/aliyun/aliyun-o......
  • go-carbon v2.2.14 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库
    carbon是一个轻量级、语义化、对开发者友好的golang时间处理库,支持链式调用。目前已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/carbongitee.com/golang-module/carbon安装使用Golang版本大于等于1.16//使用github库goget-ugithu......
  • Golang使用kcp
    安装goget-ugithub.com/xtaci/kcp-goimport("fmt""github.com/xtaci/kcp-go""golang.org/x/net/ipv4""golang.org/x/net/ipv6""net")//KCP服务器funcserver(){//创建一个UDP连接u......
  • 连接huggingface.co报错:(MaxRetryError("SOCKSHTTPSConnectionPool(host='huggingface
    参考:https://blog.csdn.net/shizheng_Li/article/details/132942548https://blog.csdn.net/weixin_42209440/article/details/129999962  ============================  随着国际顶级的AI公司广泛使用huggingface.co,现在的huggingface.co已经成了搞AI的不可或缺的一......