python - 是否可以在 python gRPC 服务器中返回自定义错误?

标签 python error-handling protocol-buffers grpc

我有一个 .proto 文件:

// Protocol Buffers Language version
syntax = "proto3";

package my_package;

// -----------------Cart service-----------------

service CartService {
    rpc AddItem(AddItemRequest) returns (AddItemResponse) {}
}

message CartItem {
    string product_id = 1;
    int32  quantity = 2;
}

message AddItemRequest {
    string user_id = 1;
    CartItem item = 2;
}

message AddItemResponse {
    string user_id = 1;
}

在我的 AddItem 方法中,我想返回一个自定义错误,例如 cart_not_found:

class CartService(my_package_pb2_grpc.CartServiceServicer):
    def AddItem(self, request, context):
         context.set_code(StatusCode.CART_NOT_FOUND)
         context.set_details('Cart Not Found!')
         return context

上面的代码不起作用,因为 gRPC 状态代码仅限于一些基本列表。如何在 gRPC 中返回自定义错误?


EDIT-1:

我看过详细设置机器可读代码的示例,如下所示:

context.set_code(grpc.StatusCode.INTERNAL)
context.set_details('cart_not_found')
return context

但这有其自身的局限性,我无法设置错误描述或任何其他自定义键。

另一种方法是在您收到的每条消息中返回错误,如下所示:

message AddItemResponse {
    string user_id = 1;
    Error error = 2;
}

message Error {
    string code = 1;
    string message = 2;
}

此实现有一个缺点,即服务需要检查错误是否存在,然后处理错误,否则处理响应。

最佳答案

您可以在尾随元数据中返回自定义 KV 对。

单元测试示例:https://github.com/grpc/grpc/blob/master/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py#L430

关于python - 是否可以在 python gRPC 服务器中返回自定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56148466/

相关文章:

C++ protobuf消息差异器的Python等效性

python - TF 中的索引操作

python - Plotly:iplot 不能与 df.iplot() 一起使用。我怎样才能让它发挥作用?

javascript - JS Axios - 发生错误时如何获取响应正文?

当用户登录错误时,php登录系统不会停止或发送任何错误消息

c# - 如何使用 protobuf-net 处理 .proto 文件

python - 通过python获取YAML中所有具有相同名称的节点

python - 防止截断不等维度的 imshow 子图 w/sharex

scala - 使用 try-catch 表达式匹配非异常值的模式

c++ - Protocol Buffer ParseFromString 不检查消息结尾