如何在 gRPC python 中定义全局错误处理程序

Seb*_*ian 8 python error-handling interceptor grpc-python

我试图捕获在任何服务程序中引发的任何异常,以便我可以确保我只传播已知的异常而不是像 ValueError、TypeError 等意外的异常。

我希望能够捕获任何引发的错误,并对它们进行格式化或将它们转换为其他错误,以更好地控制公开的信息。

我不想用 try/except 包含每个服务程序方法。

我试过使用拦截器,但我无法捕捉到那里的错误。

有没有办法为 grpc 服务器指定错误处理程序?就像你对 Flask 或任何其他 http 服务器所做的一样?

Lid*_*eng 3

gRPC Python 目前不支持服务器端全局错误处理程序。拦截器不会执行intercept_service函数内的服务器处理程序,因此无法尝试/例外。

另外,我发现 gRPC Python 服务器拦截器实现与他们在L13-Python-Interceptors.md#server-interceptors中提出的原始实现不同。如果实现坚持最初的设计,我们可以使用拦截器作为全局错误处理程序轻松使用handlerrequest/ request_iterator

# Current Implementation
intercept_service(self, continuation, handler_call_details)

# Original Design
intercept_unary_unary_handler(self, handler, method, request, servicer_context)
intercept_unary_stream_handler(self, handler, method, request, servicer_context)
intercept_stream_unary_handler(self, handler, method, request_iterator, servicer_context)
intercept_stream_stream_handler(self, handler, method, request_iterator, servicer_context)
Run Code Online (Sandbox Code Playgroud)

请将功能请求问题提交至https://github.com/grpc/grpc/issues

  • 好吧,我最终编写了一个元类,它检查服务程序的实现,并包装服务程序的方法,这样我就可以进入中间并捕获可能发生的任何异常。与 Flask 一样,拦截元数据并为请求提供全局存储也是如此。现在的拦截器并不能真正满足人们对“中间件”的期望,因此您最终必须实现中间件逻辑。 (3认同)