问题

Ryan Davis的 Ruby QuickRef 说(没有解释):

p>

Don’t rescue Exception. EVER. Or I will stab you.

为什么不呢?什么是正确的事情?



解决方法

异常 Ruby的例外层次结构的根目录,因此,当 ,您可以救援异常,包括 SyntaxError , LoadError / code>.

拯救中断会阻止用户使用 CTRL C 退出程序.

拯救 SignalException 可防止程序正确响应信号.除非通过 kill -9

拯救 SyntaxError 意味着失败的 eval 会默默执行.

所有这些都可以通过运行此程序,尝试 CTRL C kill it:

loop do
  begin
    sleep 1
    eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure"
  rescue Exception
    puts "I refuse to fail or be stopped!"
  end
end

异常救援甚至不是默认值.正在做

begin
  # iceberg!
rescue
  # lifeboats
end

不救援异常,它从 StandardError 中抢救.您通常应该指定比默认 StandardError 更具体的内容,但是从异常 扩展范围而不是缩小范围,可能会有灾难性的结果并使捕虫非常困难.


如果您有某种情况需要救援 StandardError ,并且您需要一个具有异常的变量,您可以使用此形式:

begin
  # iceberg!
rescue => e
  # lifeboats
end

相当于:

begin
  # iceberg!
rescue StandardError => e
  # lifeboats
end

begin
  # iceberg?
rescue Exception => e
  # do some logging
  raise e  # not enough lifeboats ;)
end



相关问题推荐