如何在Ruby中捕获proc的execption

如何在Ruby中捕获proc的execption,ruby,capistrano,Ruby,Capistrano,我正在为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, fu

我正在为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
parallelize do |session|
  session.run { parallel_execution("deploy.restart") }
  session.run { parallel_execution("queue.restart") }
  session.run { parallel_execution("daemon.restart") }
end
我希望捕获单个会话中发生的任何异常

即使会话中存在异常,包装器也会继续

我试着打印这些值

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

所以基本上我需要一种方法来捕获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|
  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
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任务

用proc记录异常并不是困难的部分。将其融入并行工作流程是一项挑战。搜索一点有关线程异常处理的信息。@maxpleaner线程调用的单个方法具有适当的错误处理,并将其转发到线程上的错误跟踪,但是其中一些方法没有错误处理,我们需要一种通用的方法来捕获日志跟踪中的错误,所以我编写了这个包装器,我在thread_会话数组中获取proc,而不是我的包装器,即使proc引发错误,错误处理也不起作用,所以需要一种方法来处理proc的错误这是什么
begin;线程\u会话
应该做什么?您正在尝试调用那里的
线程\u会话
进程吗?不是这样的。使用代码
parallel\u execution(session.run{deploy.restart},“deploy.restart”)
session.run的结果传递给
parallel\u execution
。。。您没有传递
会话。在这里以进程的形式运行
。这正是我想要实现的:将session.run作为进程发送到并行执行只需将它包装在
->{}
lambda表达式中,并在需要时使用
.call
运行它