golang的try catch 方式

发布时间 2023-12-06 19:17:23作者: 刘东才

列子如下 :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 }