为什么我不能从 grpc 得到非零响应和错误

Why cant i get a non nil response and err from grpc

我正在使用 golang 开发 grpc 服务,我发现如果出现 rpc 错误,我会得到

response = nil 
err = some error

即使我返回一个非零响应和错误。

但是我也在我的 pb.go 文件中看到:

err := c.cc.Invoke(ctx, "/proto.MyService/Hello", in, out, opts...)
    if err != nil {
        return nil, err
    }
    return out, nil

如果 err 不是 nil ,他们会做出 nil 响应,我想这就是我收到这样的响应的原因。

我认为在出现错误时获得响应没有意义,但仍然, 有没有一种方法可以从 grpc 获得非零响应和错误?

official documentation 所述,标准 gRPC 错误是一个代码和一个附加错误字符串。

如果您需要获得某种响应,请使用 rich error model instead to include the response with it. For an example check

原因很简单。 gRPC 是 RPC(远程过程调用)概念的特定实现,其中另一个进程被调用,就好像它是您系统的一部分一样。 gRPC 交叉编译为其他语言,包括不支持多个 return 值的 once(例如 C++、Java)。生成的客户端将抛出异常,而不是 returning 错误。因此,除了错误之外,您 return 的任何响应都将被忽略,从而使您的实现不那么便携。

虽然 go 支持两者,但我们不希望 RPC 产生不同的结果,具体取决于实现客户端的特定语言。pb.go 文件还应该做什么,除了:如果发生错误,所有信息都应该在错误中,如果没有,响应应该是returned?

充实您 return 的错误,如果您仍然发现自己两者都需要的话。