【问题标题】:Is it possible to return custom errors in python gRPC server?是否可以在 python gRPC 服务器中返回自定义错误?
【发布时间】:2019-10-02 13:06:24
【问题描述】:

我有一个.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;
}

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

【问题讨论】:

    标签: python error-handling protocol-buffers grpc


    【解决方案1】:

    https://github.com/grpc/grpc/tree/master/examples/python/errors 有一个返回自定义错误的示例。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-11-03
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        相关资源
        最近更新 更多