Ruby-重构以处理不同类型的错误
我有一个对象作为其他几个对象的父对象。其方法与此类似:Ruby-重构以处理不同类型的错误,ruby,refactoring,Ruby,Refactoring,我有一个对象作为其他几个对象的父对象。其方法与此类似: class Parent def commit begin ... rescue => e ... end end end class ChildA < Parent end class ChildB < Parent end 类父类 def提交 开始 ... 救援=>e ... 终止 终止 终止 ChildA类e来处理所有类型的异常。这行代码几乎不应该存在。您的异常处
class Parent
def commit
begin
...
rescue => e
...
end
end
end
class ChildA < Parent
end
class ChildB < Parent
end
类父类
def提交
开始
...
救援=>e
...
终止
终止
终止
ChildA类<父类
终止
B类儿童<父母
终止
但是,当commit
抛出特定类型的错误时,ChildA
必须以独特的方式运行,UniqueError
。我可以覆盖该函数的整个commit
文件,但这感觉很尴尬。如果我需要在begin
部分更改主体,那么它会给我带来问题,因为我现在需要在两个地方更改主体
重构这个的最干净的方法是什么?你不应该用
rescue=>e
吞下所有类型的异常。这行代码几乎不应该存在。您的异常处理程序应该只捕获它可以有意义地从中恢复的异常类型
更改父类,使其不会吞并所有异常,然后在子类中捕获它们:
class Parent
def commit
# ...
end
end
class Child < Parent
def commit
begin
super
rescue UniqueError => e
# ...
end
end
end
类父类
def提交
# ...
终止
终止
类子<父
def提交
开始
超级的
rescue UNIQUERROR=>e
# ...
终止
终止
终止
您不应该用rescue=>e
来处理所有类型的异常。这行代码几乎不应该存在。您的异常处理程序应该只捕获它可以有意义地从中恢复的异常类型
更改父类,使其不会吞并所有异常,然后在子类中捕获它们:
class Parent
def commit
# ...
end
end
class Child < Parent
def commit
begin
super
rescue UniqueError => e
# ...
end
end
end
类父类
def提交
# ...
终止
终止
类子<父
def提交
开始
超级的
rescue UNIQUERROR=>e
# ...
终止
终止
终止
如果父类中有一个已知的异常需要以一致的方式进行解救,例如从ActiveRecord::ResourceNotFound解救,该怎么办?你能有一个只从一个错误中解救出来的父类,并且以某种方式在子类中扩展它吗?如果父类中有一个已知的异常需要以一致的方式解救,例如从ActiveRecord::ResourceNotFound
解救,该怎么办?你能有一个只从一个错误中解救出来的父类,并且以某种方式在子类中扩展它吗?