2013-09-24 3 views
1

У меня есть объект, который служит родительским объектом для нескольких других. Он имеет метод, аналогичный этому:Ruby - рефакторинг для обработки различных типов ошибок

class Parent 
    def commit 
    begin 
    ... 
    rescue => e 
    ... 
    end 
    end 
end 

class ChildA < Parent 
end 

class ChildB < Parent 
end 

Однако ChildA должен вести себя уникальным образом, когда commit бросает определенный тип ошибки, UniqueError. Я мог бы перезаписать весь файл commit для этой функции, но это неудобно. Это заставляет меня беспокоиться, если мне нужно изменить тело в разделе begin, так как теперь мне нужно будет изменить его в двух местах.

Какой чистый способ реорганизовать это?

ответ

4

Нельзя глотать все виды исключений с rescue => e. Эта строка кода почти никогда не существует. Ваш обработчик исключений должен только фиксировать типы исключений, от которых он может осмысленно восстанавливаться.

Изменения родителя, так что она не глотает все исключения, а затем ловить их в своем классе ребенка:

class Parent 

    def commit 
    # ... 
    end 

end 

class Child < Parent 
    def commit 
    begin 
     super 
    rescue UniqueError => e 
     # ... 
    end 
    end 
end 
+0

Что делать, если есть один известное исключение, что мне нужно, чтобы спасти от последовательного образа в класс родителя, например спасение от 'ActiveRecord :: ResourceNotFound'? У вас есть родитель, который спасает только одну ошибку и как-то просто расширяет его в классе Child? – Bryce

Смежные вопросы