如何重新组合开始块的所有救援并稍后切换错误类型?
How regroup all rescues of begin block and switch type of error later?
此刻我有一个像
这样的块
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
那么如何在单次救援中测试异常类型?
您可以像这样测试异常 class:
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
此刻我有一个像
这样的块 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
那么如何在单次救援中测试异常类型?
您可以像这样测试异常 class:
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