How to define a global error handler in gRPC python

后端 未结 3 1763
眼角桃花
眼角桃花 2021-02-09 11:11

Im trying to catch any exception that is raised in any servicer so I can make sure that I only propagate known exceptions and not unexpected ones like ValueError, TypeError etc.

3条回答
  •  抹茶落季
    2021-02-09 11:43

    Maybe this will help you :)

    def _wrap_rpc_behavior(handler, fn):
        if handler is None:
            return None
    
        if handler.request_streaming and handler.response_streaming:
            behavior_fn = handler.stream_stream
            handler_factory = grpc.stream_stream_rpc_method_handler
        elif handler.request_streaming and not handler.response_streaming:
            behavior_fn = handler.stream_unary
            handler_factory = grpc.stream_unary_rpc_method_handler
        elif not handler.request_streaming and handler.response_streaming:
            behavior_fn = handler.unary_stream
            handler_factory = grpc.unary_stream_rpc_method_handler
        else:
            behavior_fn = handler.unary_unary
            handler_factory = grpc.unary_unary_rpc_method_handler
    
        return handler_factory(fn(behavior_fn,
                                  handler.request_streaming,
                                  handler.response_streaming),
                               request_deserializer=handler.request_deserializer,
                               response_serializer=handler.response_serializer)
    
    
    class TracebackLoggerInterceptor(grpc.ServerInterceptor):
    
        def intercept_service(self, continuation, handler_call_details):
            def latency_wrapper(behavior, request_streaming, response_streaming):
    
                def new_behavior(request_or_iterator, servicer_context):
                    try:
                        return behavior(request_or_iterator, servicer_context)
                    except Exception as err:
                        logger.exception(err, exc_info=True)
                return new_behavior
    
            return _wrap_rpc_behavior(continuation(handler_call_details),    latency_wrapper)
    

提交回复
热议问题