如何重新组合开始块的所有救援并在以后切换错误类型?

时间:2015-02-19 10:41:47

标签: exception ruby-on-rails-4 typeerror rescue

这一刻我有一个像

这样的街区
  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 个答案:

答案 0 :(得分: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