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

Ruby Net::HTTP流式响应时如何捕获Get/Post请求错误?

Ruby Net::HTTP流式请求的错误捕获与响应对象处理

错误捕获方式

流式处理过程中的错误(包括网络传输异常、业务逻辑错误)不会自动被处理,需要你主动通过begin-rescue块捕获:

  • 网络IO错误:比如连接中断、服务器提前关闭连接等,这类错误会在response.read_body执行过程中直接抛出异常。
  • 业务逻辑错误:你在@block.call(chunk)中处理数据时的异常,需要在块内部单独捕获。

响应对象是否会更新错误?

不会。response对象的状态码、响应头等信息是在HTTP握手完成后就确定的,后续流式传输阶段的错误属于IO层面的异常,不会修改response的任何属性。

修改后的代码示例

http_request = Net::HTTP::Get.new(path_with_query, headers)
Net::HTTP.start(host, port, connect_opts) do |http|
  http.request(http_request) do |response|
    if response.code != "200"
      raise "请求失败,状态码:#{response.code}"
    end

    begin
      response.read_body do |chunk|
        next unless chunk.length > 0

        begin
          # 捕获业务块内部的错误
          @block.call(chunk)
        rescue => block_error
          # 处理业务逻辑错误:记录日志、中断处理等
          puts "处理Chunk时发生业务错误:#{block_error.message}"
          # 可选:中断流式读取
          break
        end
      end
    rescue => io_error
      # 捕获网络IO层面的错误
      puts "流式读取时发生网络错误:#{io_error.message}"
      # 这里可执行重试、资源清理等操作
    end
  end
end

补充说明

  • 外层rescue负责捕获网络传输相关的异常,确保连接异常时不会直接崩溃程序。
  • 内层rescue针对业务逻辑错误,避免单个Chunk处理失败导致整个流式任务终止(除非你希望终止)。
  • 若需要提前终止流式读取,在rescue块中调用break即可停止read_body的迭代。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:53:10