Is there a way to make it easier for each reraise error? A global solution or a function?
You could monkeypatch raise
.
module RaiseNotify
def raise(msg_or_exc, msg=msg_or_exc, trace=caller)
Notification.send_to(:admin, msg_or_exc) if msg_or_exc.kind_of? StandardError
fail msg_or_exc, msg=msg_or_exc, trace
end
end
module Kernel
include RaiseNotify
end
I haven't tested this, it would probably have impact beyond Rails, and I think it's a bad idea! Personally, I'd just call the notification code inside the initial rescue
clause.
def send_date
date = Date.strptime('10/100/2013', '%m/%d/%Y')
render json: {success: true, date: date}
rescue ArgumentError => e
Notification.send_to(:admin, e)
render json: {success: false, msg: 'Bad date'}
end
This may be shortened with a method:
def rescue_with_notify error_type=ArgumentError
*yield
rescue error_type => e
Notification.send_to(:admin, e)
[nil,false]
end
The idea would be to wrap what you wish to check, and respond with an array, the end of which would be the "success" flag.
def send_date date_string
date,success = rescue_with_notify do
Date.strptime(date_string, '%m/%d/%Y')
end
success = true if success.nil?
date ||= "Bad date"
render json: {success: success, date: date}
end
But this is adding complexity and maybe extra lines for very little in return. I'd stick with pasting the notification code into rescue clauses as and when it's required.