|
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()
}
pkg/utils/goroutine.go
Lines 41 to 60 in e3528ea
这里的 GoWithRecover 是不是拆成两个函数比较好,我在使用 errgroup 需要传入裸函数,这样拆分可以使用到 recover 机制,同时是否开启 goroutine 交给用户决定。