异常处理

时间:2014-09-18 05:35:04

标签: ruby exception-handling

我想添加一个异常处理程序。在一个类中,我有很多方法,我想在所有这些方法中添加begin rescue end。我可以在一个地方定义它,而不是在所有方法中添加begin rescue end吗?

2 个答案:

答案 0 :(得分:1)

您可以将错误处理提取到方法中,并从所有其他方法中调用它。

class Foo
  def method1
    with_exception_handling do
      raise 'some error'
    end
  end

  def method2
    with_exception_handling do
      puts "normal execution"
    end
  end

  private
  def with_exception_handling(&block)
    begin
      block.call
    rescue => ex
      puts "caught exception: #{ex.message}"
    end
  end
end

f = Foo.new
f.method1
f.method2
# >> caught exception: some error
# >> normal execution

答案 1 :(得分:1)

我认为一般来说,进行如此广泛的异常处理并不是一个好主意,因为它会增加难以检测到错误通过测试和错误日志的机会。但是,如果您有一个非常好的用例,则可以使用method_missing创建一种优雅的方法来挽救每个方法,而无需更改每种方法中的代码。

如果你的方法是

my_object.my_method

您可以使用method_missing来使用以下语法:

my_object.my_method_rescued

_rescued附加到任何方法名称将执行包含在错误处理程序中的方法。

这是一个非常粗略的例子,但它应该给你一个想法:

class MyClass
  def my_method
   raise 'error!!!'
  end

  def method_missing(method_name, *args)
    if method_name.to_s.end_with? '_rescued' 
      rescue_wrapper(method_name[0..-9], *args)
    end
  end

  private
  def rescue_wrapper(method_name, *args)
    begin
      self.send(method_name, *args)
    rescue => e
      # Error handling code here...
    end
  end

end


my_object = MyClass.new
my_object.my_method_rescued # => Calls error handling code on error
my_ojbect.my_method # => Raises an exception on error