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
解救,该怎么办?你能有一个只从一个错误中解救出来的父类,并且以某种方式在子类中扩展它吗?