我的一个模型中有以下方法来保存用户记录:
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
我们可以看到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
如上所述对实施的任何想法都将是一个很大的帮助。
答案 0 :(得分:16)
这样的事情:
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
在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
答案 1 :(得分:2)
您可以尝试
def save_user(params)
save_user_details(params)
rescue => e
handle_exception(e)
end
def handle_exception(error)
Rails.logger.info(error.message)
Rails.logger.info(error.backtrace.join(‘\n’))
{ success: false, errors: error.messages }
end
here这就是为什么你不应该拯救Exception