Aja*_*jay 6 ruby ruby-on-rails exception block
我在我的一个模型中有以下方法来保存用户记录:
def save_user(params)
begin
save_user_details(params)
rescue ActiveRecord::RecordInvalid => ex
{ success: false, errors: ex.messages }
rescue Exception => ex
Rails.logger.info(ex.message)
Rails.logger.info(ex.backtrace.join(‘\n’)
{ success: false, errors: ’Some error occurred.}
end
end
Run Code Online (Sandbox Code Playgroud)
我们可以看到rescue块很重,这种块在其他行为中也很常见.所以我考虑重构这个并将rescue块移动到一个单独的函数.我想实现这样的事情:
def save_user(params)
begin
save_user_details(params) # my method to save the details
handle_the_exception # not sure how to implement this
end
def handle_the_exception
# How to handle here ?
end
Run Code Online (Sandbox Code Playgroud)
如上所述对实施的任何想法都将是一个很大的帮助.
A F*_*kly 18
像这样的东西:
def save_user(params)
handle_exception do
save_user_details(params) # my method to save the details
end
end
def handle_exception(&block)
begin
block.call
rescue => ex
Rails.logger.info(ex.message)
Rails.logger.info(ex.backtrace.join("\n")
{ success: false, errors: "Some error occurred."}
end
end
Run Code Online (Sandbox Code Playgroud)
在IRB:
2.2.0 :021 > def handle_exception(&block)
2.2.0 :022?> begin
2.2.0 :023 > block.call
2.2.0 :024?> rescue => ex
2.2.0 :025?> puts ex.inspect
2.2.0 :026?> puts "handled"
2.2.0 :027?> end
2.2.0 :028?> end
=> :handle_exception
2.2.0 :029 > handle_exception do
2.2.0 :030 > raise "hell"
2.2.0 :031?> puts "Don't reach me"
2.2.0 :032?> end
#<RuntimeError: hell>
handled
=> nil
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2130 次 |
| 最近记录: |