class A
def a_method
#..
end
end
class B < A
def method_1
# ...
a_method
end
def method_2
# ...
a_method
end
# ...
def method_n
# ...
a_method
end
end
a_method
偶尔抛出AException。
我想从这个例外中解救,比如:
class B < A
def method_1
# ...
a_method
rescue AException => e
p e.message
end
# ...
end
我想在B类(method_1
,method_2
,...,method_n
)内的每个方法中以同样的方式进行拯救。我坚持找出一个漂亮而干净的解决方案,不需要复制救援代码块。你能帮帮我吗?
答案 0 :(得分:10)
如何使用块:
class B < A
def method_1
# some code here which do not raised an exception
with_rescue do
# method which raised exception
a_method
end
end
def method_2
with_rescue do
# ...
a_method
end
end
private
def with_rescue
yield
rescue => e
...
end
end
答案 1 :(得分:5)
像这样,也许?
class B < A
def method_1
# ...
safe_a_method
end
private
def safe_a_method
a_method
rescue AException => e
...
end
end
答案 2 :(得分:5)
如果您想要始终挽救例外,则可以覆盖a_method
中的B
:
class B < A
def a_method
super
rescue AException => e
p e.message
end
# ...
end
此外,您可能希望返回一个值(例如nil
或false
)来指示失败。
答案 3 :(得分:1)
您可以使用像这样的模块包装您的方法。 好处是,与其他解决方案不同,您可以使用常规名称调用方法,并且不必更改方法本身。 只需使用ErrorHandler方法扩展类,最后枚举方法,用错误处理逻辑包装它们。
module ErrorHandler
def wrap(method)
old = "_#{method}".to_sym
alias_method old, method
define_method method do |*args|
begin
send(old, *args)
rescue => e
puts "ERROR FROM ERRORHANDLER #{e.message}"
end
end
end
end
class A
extend ErrorHandler
def a_method v
"a_method gives #{v.length}"
end
(self.instance_methods - Object.methods).each {|method| wrap method}
end
class B < A
extend ErrorHandler
def method_1 v
"method_1 gives #{v.length}"
end
(self.instance_methods - Object.methods).each {|method| wrap method}
end
puts A.new.a_method "aa" # a_method gives 2
puts A.new.a_method 1 # ERROR FROM ERRORHANDLER undefined method `length' for 1:Fixnum
puts B.new.method_1 1 # ERROR FROM ERRORHANDLER undefined method `length' for 1:Fixnum