以正确的方式处理 gRPC 服务器运行时异常
Handling gRPC server runtime exceptions in a proper way
我想了解一下 gRPC 中的异常处理机制是如何工作的。
除了try-catch块之外还有其他方法来处理运行时异常,例如服务器端的IllegalArgumentException
吗?
例如,我有一些 gRPC 流式客户端服务,其中方法 onNext
在传递的参数不满足某些 asserts[=26= 的情况下抛出 IllegalArgumentException
] 在深层次上(在某些库中,例如 com.google.common.base.Preconditions
)。
在这种情况下,客户端将有 StatusRuntimeException
和 Status.UNKNOWN
,但是否有另一种解决方案允许不处理此类异常并在服务调用后将它们转换为可读 StatusRuntimeException
?
通常您应该在服务器端捕获所有异常,并将它们转换为正确的 StatusRuntimeException
或 StatusException
。但是,您可以通过在服务器上使用 TransmitStatusRuntimeExceptionInterceptor
class 自动为您转换错误来避免这种情况。
它通常不被使用的原因是因为它意味着意外错误看起来与预期错误相同。您可能不想传播异常消息,可能是因为它具有私有用户数据,而是在您的服务器处理程序中重写它。
我想了解一下 gRPC 中的异常处理机制是如何工作的。
除了try-catch块之外还有其他方法来处理运行时异常,例如服务器端的IllegalArgumentException
吗?
例如,我有一些 gRPC 流式客户端服务,其中方法 onNext
在传递的参数不满足某些 asserts[=26= 的情况下抛出 IllegalArgumentException
] 在深层次上(在某些库中,例如 com.google.common.base.Preconditions
)。
在这种情况下,客户端将有 StatusRuntimeException
和 Status.UNKNOWN
,但是否有另一种解决方案允许不处理此类异常并在服务调用后将它们转换为可读 StatusRuntimeException
?
通常您应该在服务器端捕获所有异常,并将它们转换为正确的 StatusRuntimeException
或 StatusException
。但是,您可以通过在服务器上使用 TransmitStatusRuntimeExceptionInterceptor
class 自动为您转换错误来避免这种情况。
它通常不被使用的原因是因为它意味着意外错误看起来与预期错误相同。您可能不想传播异常消息,可能是因为它具有私有用户数据,而是在您的服务器处理程序中重写它。