2015-02-19 9 views
0

на данный момент у меня есть блок какКак перегруппировать все спасения начального блока и тип коммутатора позже?

begin 
    yield 
    rescue MyError => e 
    call_specific_method 
    call_method_foo 
    render json: { error: e.to_s } 
    rescue ActiveRecord::RecordInvalid => e 
    call_specific_method 
    call_method_foo 
    render json: { error: e.to_s } 
    rescue => e 
    call_specific_method 
    call_method_foo 
    render json: { error: e.to_s } 
    end 

поэтому у меня есть много дублирующих инструкции, потому что они похожи на каждое исключение:

call_method_foo 
render json: { error: e.to_s } 

, но у меня тоже есть конкретные инструкции:

call_specific_method 

Мне нужно сделать что-то вроде:

begin 
    yield 
    rescue => e 
    if e.type == ActiveRecord::RecordInvalid 
     call_specific_method 
    elsif e.type == MyError 
     call_specific_method 
    else 
     call_specific_method 
    end 
    call_method_foo 
    render json: { error: e.to_s } 
    end 

Итак, как я могу проверить тип исключения в одиночном спасении?

ответ

1

Вы можете проверить класс исключения, как это:

rescue => e 
    if e.is_a?(ActiveRecord::RecordInvalid) 
    ... 
    end 
end 

В любом случае, я бы лучше извлечь общий код для внешнего частного метода:

def foo 
    ... 
    begin 
    yield 
    rescue MyError => e 
    call_specific_method 
    render_error_for(e) 
    rescue ActiveRecord::RecordInvalid => e 
    call_specific_method 
    render_error_for(e) 
    rescue => e 
    call_specific_method 
    render_error_for(e) 
    end 
end 

def render_error_for(e) 
    call_method_foo 
    render json: { error: e.to_s } 
end 
+0

почему это лучше экстракт общего код, а не конкретный код? – Matrix

+0

Я предполагал, что каждый '' call_specific_method'' отличается для каждого класса исключений, не так ли? – dgilperez

+0

Да, нормально, на самом деле список спасения, такой же, как и мой, так что это нормально, thx. – Matrix

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

  • Нет связанных вопросов^_^