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
相关产品推荐
相关产品推荐

