如何在Ruby中捕获proc的execption
我正在为Capistrano并行执行cap任务 parallelize方法创建会话,这些会话作为proc传递给我编写的包装器,以捕获会话中发生的任何异常如何在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
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
运行它