为何调用Concurrent::Future的rescue方法时出现NoMethodError错误?
问题原因与解决方案
你遇到的undefined method 'rescue'错误,核心原因是**Concurrent::Future实例本身并没有rescue这个链式方法**,你参考的文章里的写法要么是基于旧版本的concurrent-ruby(早期版本可能给Future添加了rescue方法),要么实际使用的是Concurrent::Promise(Future的子类,自带链式rescue能力)。
下面给你三种可行的解决方式:
方式一:在Future执行块内部直接捕获异常
把异常处理逻辑写在execute的代码块里,让异常在异步执行线程中被捕获:
executed_future = Concurrent::Future.execute do begin url = "#{endpoint}#{datum[:hierarchy_id]}#{valuation_date}" raise StandardError.new("Testing error!") # 测试用异常 # 你的业务代码 rescue => exception @exceptions << exception binding.pry # 可选:返回一个默认值,避免后续调用value时抛出异常 nil end end
方式二:改用Concurrent::Promise实现链式异常处理
如果偏好链式调用的写法,直接用Concurrent::Promise(它是Future的子类,提供了rescue、then等链式方法):
executed_promise = Concurrent::Promise.execute do url = "#{endpoint}#{datum[:hierarchy_id]}#{valuation_date}" raise StandardError.new("Testing error!") # 测试用异常 # 你的业务代码 end.rescue do |exception| @exceptions << exception binding.pry nil end # 注意:需要调用value/wait触发执行(如果需要同步获取结果) executed_promise.value
方式三:在获取Future结果时捕获异常
当你调用Future的value方法获取结果时,执行块中未捕获的异常会被重新抛出,此时可以在这里统一处理:
executed_future = Concurrent::Future.execute do url = "#{endpoint}#{datum[:hierarchy_id]}#{valuation_date}" raise StandardError.new("Testing error!") # 测试用异常 # 你的业务代码 end # 在需要获取结果时捕获异常 begin result = executed_future.value rescue => exception @exceptions << exception binding.pry end
内容的提问来源于stack exchange,提问作者DariusP
相关产品推荐
相关产品推荐

