如何在 Ruby 中捕获 proc 的异常

How to catch execption for proc in Ruby

我正在使用 cap-ext-parallelize gem 并行执行 Capistrano 的 cap 任务

parallelize 方法创建的会话作为 proc 传递给我编写的包装器以捕获会话中发生的任何异常

parallelize do |session|
  session.run {deploy.restart} 
  session.run {queue.restart}
  session.run {daemon.restart}
end

下面是封装代码

def parallel_execution(thread_session, function_name)
  begin
    thread_session
  rescue StandardError => e
    puts "[Error] #{function_name} failed with error #{e.message}"
    raise e.class, "[Error] #{function_name} failed with error #{e.message}"
  end
end

下面是包装器调用

parallelize do |session|
  parallel_execution(session.run {deploy.restart}, "deploy.restart")
  parallel_execution(session.run {queue.restart}, "queue.restart")
  parallel_execution(session.run {daemon.restart}, "daemon.restart")
end

我想捕获单个会话中发生的任何异常

即使会话中出现异常,包装程序也会继续

我已经尝试打印值

会话作为数组传递给包装器,数组元素是 proc

所以基本上我需要一种方法来捕获 proc 块中的异常

我遇到了这个问题ruby-proc-call-catching-exceptions but it does not give a way to catch exceptions in proc

我在这里采取了不同的方法

包装方法

def parallel_execution(thread_session)
  begin
    eval thread_session
  rescue StandardError => e
    puts "[Error] #{function_name} failed with error #{e.message}"
    raise "[Error] #{thread_session} failed with error #{e.message}"
end

结束

包装器调用

parallelize do |session|
  session.run { parallel_execution("deploy.restart") }
  session.run { parallel_execution("queue.restart") }
  session.run { parallel_execution("daemon.restart") }
end

我将 Rake 任务作为字符串传递给包装器并使用 eval 调用了 rake 任务