Как перегруппировать все спасения начала блока и переключить тип ошибки позже?
На данный момент у меня есть блок, как
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