code: func WithRecovery(exec func(), recoverFn func(r interface{})) {
  	defer func() {
  		r := recover()
  		if recoverFn != nil {
  			recoverFn(r)
  		}
  		if r != nil {
  			logutil.Logger(context.Background()).Error("panic in the recoverable goroutine",
  				zap.Reflect("r", r),
  				zap.Stack("stack trace"))
  		}
  	}()
  	exec()
  }
docs: // WithRecovery wraps goroutine startup call with force recovery.
  // it will dump current goroutine stack into log if catch any recover result.
  //   exec:      execute logic function.
  //   recoverFn: handler will be called after recover and before dump stack, passing `nil` means noop.