如何将救援块移动到方法

时间:2015-06-30 09:21:48

标签: ruby-on-rails ruby 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

我们可以看到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

如上所述对实施的任何想法都将是一个很大的帮助。

2 个答案:

答案 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