我想挽救外部gem提供的rake任务引发的异常。
理想情况下,我想创建一个名称相同的rake任务,该任务将调用原始任务并仅处理异常。像这样:
original_task = Rake.application.tasks.find { |t| t.name == "original_namespace:original_task" }
Rake::Task["original_namespace:original_task"].clear
namespace :original_namespace do
task original_task: :environment do
begin
original_task.invoke
rescue SystemExit
# do something
end
end
end
这行不通,因为似乎您不能仅复制rake任务并将其保存在内存中。
答案 0 :(得分:2)
这将是一个过大的杀伤力,但它应该起作用:
Rake::Task.prepend(Module.new do
def invoke(*args)
case name
when "original_namespace:original_task"
begin
super(*args)
rescue => e
Logger.warn("Task failed, rescued")
end
else super(*args)
end
end
end)
一旦将其添加到初始化程序中的某个位置,它应该使其自动挽救相应的异常。