code: func NewUnaryServerPanicCatcher(next grpc.UnaryServerInterceptor) grpc.UnaryServerInterceptor {
  	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
  		defer paniccatcher.Catch(func(p *paniccatcher.Panic) {
  			logging.Fields{
  				"panic.error": p.Reason,
  			}.Errorf(ctx, "Caught panic during handling of %q: %s\n%s", info.FullMethod, p.Reason, p.Stack)
  			err = Internal
  		})
  		if next != nil {
  			return next(ctx, req, info, handler)
  		}
  		return handler(ctx, req)
  	}
  }
docs: // NewUnaryServerPanicCatcher returns a unary interceptor that catches panics
  // in RPC handlers, recovers them and returns codes.Internal gRPC errors
  // instead.
  //
  // It can be optionally chained with other interceptor.