Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将每个命令包装在rescue语句中_Ruby_Selenium_Exception Handling - Fatal编程技术网

Ruby 将每个命令包装在rescue语句中

Ruby 将每个命令包装在rescue语句中,ruby,selenium,exception-handling,Ruby,Selenium,Exception Handling,我有10个Ruby函数调用要执行,每个调用都可能引发异常。我希望以相同的方式处理每个异常并继续。有没有一种方法可以做到这一点,而不必将每一行都包装在begin救援结束块 [编辑]:这个用例是一个屏幕刮板/自动化工具,它使用Selenium web驱动程序来填写表单。我不想麻烦检查select元素中是否存在选项,只要尽可能地填写它们就行了。为此,我需要调用Selenium::WebDriver::Support::Select。如果抛出“无法找到值为x的选项”异常,请按选择并继续操作。您的意思是这

我有10个Ruby函数调用要执行,每个调用都可能引发异常。我希望以相同的方式处理每个异常并继续。有没有一种方法可以做到这一点,而不必将每一行都包装在
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中查询该状态这看起来是一个更通用、可重用的解决方案!