Как перегруппировать все спасения начала блока и переключить тип ошибки позже?

На данный момент у меня есть блок, как

  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
Другие вопросы по тегам