-
Notifications
You must be signed in to change notification settings - Fork 29
Open
Description
Lines 41 to 60 in e3528ea
| func GoWithRecover(handler func(), recoverHandler func(r interface{})) { | |
| go func() { | |
| defer func() { | |
| if r := recover(); r != nil { | |
| recoverLogger(os.Stderr, r) | |
| if recoverHandler != nil { | |
| go func() { | |
| defer func() { | |
| if p := recover(); p != nil { | |
| recoverLogger(os.Stderr, p) | |
| } | |
| }() | |
| recoverHandler(r) | |
| }() | |
| } | |
| } | |
| }() | |
| handler() | |
| }() | |
| } |
这里的 GoWithRecover 是不是拆成两个函数比较好,我在使用 errgroup 需要传入裸函数,这样拆分可以使用到 recover 机制,同时是否开启 goroutine 交给用户决定。
func GoWithRecover(handler func(), recoverHandler func(r interface{})) {
go func() {
WithRecover(handler, recoverHandler)
}()
}
func WithRecover(handler func(), recoverHandler func(r interface{})) {
defer func() {
if r := recover(); r != nil {
recoverLogger(os.Stderr, r)
if recoverHandler != nil {
go func() {
defer func() {
if p := recover(); p != nil {
recoverLogger(os.Stderr, p)
}
}()
recoverHandler(r)
}()
}
}
}()
handler()
}Metadata
Metadata
Assignees
Labels
No labels