How to move the rescue block into a method

I have the following method in one of my models to save a user record:

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

      

We see that the block rescue

is heavy, and such a block is common in other actions. So I thought to refactor this and move the block rescue

into a separate function. I want to implement something like this:

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

      

Any thoughts on the implementation as above would be helpful.

+3


source to share


2 answers


Something like that:

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

      



In 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 

      

+10


source


You can try doing

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

      



And here 's why you shouldn't saveException

+2


source







All Articles