You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

gRPC C++中grpcServerReaderWriter的Read/Write返回false时如何获取详细错误信息?

gRPC C++服务端双向流Read/Write返回false时获取错误信息的方法

当grpc::ServerReaderWriter的Read()或Write()返回false时,你可以通过以下几种方式获取具体的错误原因:

  • 调用Finish()方法获取状态:
    服务端的ServerReaderWriter继承自ServerStream类,是提供Finish()方法的。你可以在Read/Write返回false后调用它,返回的grpc::Status对象会包含错误码和详细描述。示例代码:

    grpc::Status stream_status = stream.Finish();
    if (!stream_status.ok()) {
      // 获取错误码和描述
      auto error_code = stream_status.error_code();
      auto error_msg = stream_status.error_message();
      // 处理错误逻辑
    }
    

    注意:调用Finish()后,流会被正式关闭,后续不能再进行Read/Write操作。

  • 通过ServerContext查询状态:

    • 使用context.IsCancelled()快速判断流是否被主动取消(比如客户端断开、超时或调用了Cancel)。
    • 若gRPC版本≥1.30,可调用context.GetCancelReason()获取取消的具体原因字符串,比如连接重置、客户端超时等。
    • 直接通过context.status()获取当前流的状态,不过这个状态在流未结束时可能不够准确,建议在Read/Write返回false后再查询。
  • 注册结束回调(异步场景):
    如果你使用异步处理流,可以通过ServerContext::AsyncNotifyWhenDone()注册一个回调函数,当流结束时会触发该回调,在回调内可以获取完整的ServerContext状态信息。

补充:头文件sync_stream.h的注释仅说明返回false代表流关闭,但实际底层的错误信息会被保留在ServerContext或通过Finish()方法返回,这是服务端获取流关闭原因的标准方式。

内容的提问来源于stack exchange,提问作者zeodtr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:07:11