Ruby 将每个命令包装在rescue语句中
我有10个Ruby函数调用要执行,每个调用都可能引发异常。我希望以相同的方式处理每个异常并继续。有没有一种方法可以做到这一点,而不必将每一行都包装在Ruby 将每个命令包装在rescue语句中,ruby,selenium,exception-handling,Ruby,Selenium,Exception Handling,我有10个Ruby函数调用要执行,每个调用都可能引发异常。我希望以相同的方式处理每个异常并继续。有没有一种方法可以做到这一点,而不必将每一行都包装在begin救援结束块 [编辑]:这个用例是一个屏幕刮板/自动化工具,它使用Selenium web驱动程序来填写表单。我不想麻烦检查select元素中是否存在选项,只要尽可能地填写它们就行了。为此,我需要调用Selenium::WebDriver::Support::Select。如果抛出“无法找到值为x的选项”异常,请按选择并继续操作。您的意思是这
begin
<代码>救援<代码>结束块
[编辑]:这个用例是一个屏幕刮板/自动化工具,它使用Selenium web驱动程序来填写表单。我不想麻烦检查select元素中是否存在选项,只要尽可能地填写它们就行了。为此,我需要调用Selenium::WebDriver::Support::Select。如果抛出“无法找到值为x的选项”异常,请按选择并继续操作。您的意思是这样的吗
class Wtf
def f1
raise "f1"
end
def f2
raise "f2"
end
end
obj= Wtf.new
[:f1, :f2].each do |f|
begin
obj.send f
rescue Exception=> e
p e
end
end
编辑:向示例添加更多代码您可以执行以下操作:
begin
do_something
do_something_else
do_do_do
rescue Exception1 => e
# error handling
rescue Exception2 => e
# error handling
如果do_某事抛出异常,则不会调用其他调用。我认为这比做很多<代码>开始更好。。救援模块。只需处理不同的异常。我喜欢qwned使用#send的方法,但它不适合于并非所有方法都将被顺序调用的情况
def f1; raise "X"; end
def f2; raise "Y"; end
#...
funcList = [:f1,:f2,...]
funcList.each{|f|
begin
send(f)
rescue Exception => e
#handle
end
}
延续非常适合这种情况:
require 'continuation'
class Continuer
# Define five methods for testing
(1..5).each { |i| define_method("method#{i}") { puts "method#{i} called" } }
def do_these_things
cc = nil
callcc { |c| cc = c; method1; }
callcc { |c| cc = c; method2; raise }
# Do other things right here, maybe...
callcc { |c| cc = c; method3; raise }
callcc { |c| cc = c; method4; }
callcc { |c| cc = c; method5; }
rescue
puts 'Caught exception. Continuing.'
cc.call
end
end
Continuer.new.do_these_things
这是通过在执行每个容易出错的方法时在“cc”变量中记录一个延续来实现的。救援声明随后简单地继续下去。这有点像一个带有动态标签的goto语句。我发现它也能满足我的需求:
def action
yield
rescue
....
ensure
....
end
action { call1 }
action { call2 }
action { call3 }
这些语句都抛出相同的异常,我希望它们都被执行。不幸的是,这不是一个有效的答案:(好的,但这取决于你的需要。你想以不同的方式处理每个故障吗?为什么不将它们放在一个单独的救援块中?我猜你想知道异常抛出的“位置”,所以你应该尝试在每个函数之后(或内部)更改一些“状态”然后在rescue BLOCK中查询该状态这看起来是一个更通用、可重用的解决方案!