Если вы отправляете много писем, вы можете также сохранить ваш код более DRY и получать уведомления исключений на вашу электронную почту, делая что-то вроде этого:
status = Utility.try_delivering_email do
ClientMailer.signup_confirmation(@client).deliver
end
unless status
flash.now[:error] = "Something went wrong when we tried sending you and email :("
end
Utility Класс:
class Utility
# Logs and emails exception
# Optional args:
# request: request Used for the ExceptionNotifier
# info: "A descriptive messsage"
def self.log_exception(e, args = {})
extra_info = args[:info]
Rails.logger.error extra_info if extra_info
Rails.logger.error e.message
st = e.backtrace.join("\n")
Rails.logger.error st
extra_info ||= "<NO DETAILS>"
request = args[:request]
env = request ? request.env : {}
ExceptionNotifier::Notifier.exception_notification(env, e, :data => {:message => "Exception: #{extra_info}"}).deliver
end
def self.try_delivering_email(options = {}, &block)
begin
yield
return true
rescue EOFError,
IOError,
TimeoutError,
Errno::ECONNRESET,
Errno::ECONNABORTED,
Errno::EPIPE,
Errno::ETIMEDOUT,
Net::SMTPAuthenticationError,
Net::SMTPServerBusy,
Net::SMTPSyntaxError,
Net::SMTPUnknownError,
OpenSSL::SSL::SSLError => e
log_exception(e, options)
return false
end
end
end
Получил мое первоначальное вдохновение здесь: http://www.railsonmaui.com/blog/2013/05/08/strategies-for-rails-logging-and-error-handling/
Я не хочу, чтобы показать пользователю исключение, мне нужно просто идентифицировать, что доставка не удалось – com
пользователь не будет видеть исключение до тех пор, как вы спасательных и справиться! Мне также нравится сообщать о вещах Airbrake или какой-либо службе уведомлений об исключениях, чтобы мы знали, что происходит в случае сбоев, даже если они обрабатываются приятно. – Ricky