func SafeGoroutineWithRequestID(f func(), requestID string) {
defer func() {
if err := recover(); err != nil {
stack := Stack(3)
logger.LogErrorf("[Recovery] %s %s panic recovered:\n%s\n%s", time.Now().Format("2006/01/02 - 15:04:05"), err, stack, false)
}
}()
logger.SetLogId(requestID)
f()
}
把函数当成参数传入进来,并且传入requestID。这时候就把recover 这一层抽象出来了。
但是问题来了。没有带参数的函数能够很好的放入到这个函数中。比如
func testPanic(){
x, y := 100, 0
c := x/y
fmt.Println(c)
}
如果这个时候传入参数 y 是0 就会触发panic。但是这种函数没有入参。有入参又要怎么处理呢?
使用闭包的方式就可以处理了。
比如上面的comparefee 函数。
f := func() {
compareV2ShippingFee(ctx, currentResult, data, calculateData, requestID)
}
go apiutils.SafeGoroutineWithRequestID(f2, requestID)
使用这种方式就饿能够达到目的。
至此,就能够愉快的开协程了。