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