【问题标题】:Ruby - Proc.call - catching exceptionsRuby - Proc.call - 捕获异常
【发布时间】:2016-04-20 06:58:54
【问题描述】:

我在捕获调用 Proc object 的异常和错误时遇到问题。查看我的代码:

def method1
  .. do something ...
end

def method2
.. do something ...
end

def run_method_safely(proc_obj)
  begin
    proc_obj.call
  rescue => e
    puts "Error man!"
    ... do something ...
  end
end

我有几个方法(这里我只有method1, method2,但在代码中我有更多方法)是由方法run_method_safely 运行的。我这样做是因为我不想让每个方法都在 begin-rescue 块中,所以我编写了方法来解决这个问题。见:

.
run_method_safely(Proc.new { method1 })
run_method_safely(Proc.new { method2 })
.

问题是当proc_obj.call 执行时出现错误(方法丢失,Webdriver - 未找到此类元素或其他)救援块未执行,程序正在运行,就像什么都没发生一样。。 p>

有人知道如何从 Proc 代码中捕获错误和异常吗?

【问题讨论】:

  • 你能生成一个可运行的样本来重现这个吗?

标签: ruby proc rescue


【解决方案1】:

你确定你的样本是正确的吗?

def safe(proc)
  begin
    proc.call
  rescue
    puts "error"
  end
end

def m1
  puts "m1"
  raise
end

def m2
  puts "m2"
end

safe(Proc.new { m1 })
safe(Proc.new { m2 })

打印

m1
error
m2

对我来说。

顺便说一句:您不需要将调用包装在 Proc 中,您可以直接传递 Method 对象。

safe(method(:m1))

【讨论】:

  • 或者——甚至更直接地——传递一个块,即safe { m1 }
【解决方案2】:

我觉得应该是的

rescue Exception => e

rescue 的默认设置不是捕获所有错误,而是仅捕获源自StandardError 的错误。

旁注:我不知道语法

rescue => e

有效。 => 是二元运算符,您没有为此提供左参数。

【讨论】:

  • => 根本不是运算符。你的意思是<= 还是>=
  • 算不算算子?在任何情况下,它都在散列中使用,以将键与值分开。 { 'key' => 'value',....}。我不应该称它为运营商;它更像是标点符号,但两边都需要一些东西......
  • 我认为正确的术语是 punctuator。无论如何,正如您现在所知,它有两种不同的含义。
  • 我认为你不应该从 Exception 中拯救出来,因为它是为我们按下 Ctrl-C 时的中断和 NoMemoryError 等事情保留的。在旁注中,它将正确地从标准错误中拯救出来,而不是例外。参考:thoughtbot.com/blog/rescue-standarderror-not-exception
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2011-10-17
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多