我想添加一个异常处理程序。在一个类中,我有很多方法,我想在所有这些方法中添加begin rescue end
。我可以在一个地方定义它,而不是在所有方法中添加begin rescue end
吗?
答案 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