通知所有错误并保持不同的救援

时间:2015-07-18 11:46:48

标签: ruby-on-rails ruby rescue

我正在尝试发送所有铁路错误作为通知,而不会打扰其他救援

的ApplicationController

class ApplicationController < ActionController::Base
around_filter :notify_errors

  def notify_errors
    begin
      yield
    rescue => e
      Notification.send_to(:admin, e)
    end
  end
end

SomeController 功能:

  def send_date
    date = Date.strptime('10/100/2013', '%m/%d/%Y')
    render json: {success: true, date: date}
  rescue ArgumentError
    render json: {success: false, msg: 'Bad date'}
  end

我得到了“错误的约会”json但不是Notification.send_to(:admin, e)

2 个答案:

答案 0 :(得分:2)

再次提出你的例外情况。

def send_date
    date = Date.strptime('10/100/2013', '%m/%d/%Y')
    render json: {success: true, date: date}
rescue ArgumentError => e
    render json: {success: false, msg: 'Bad date'}
    raise e
end

答案 1 :(得分:1)

  

有没有办法让每个重新加注错误更容易?全球解决方案还是功能?

你可以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

我没有测试过这个,它可能会超出Rails的影响,我认为这是一个坏主意!就个人而言,我只是在最初的rescue子句中调用通知代码。

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

这可以通过以下方法缩短:

def rescue_with_notify error_type=ArgumentError
  *yield 
rescue error_type => e      
  Notification.send_to(:admin, e)
  [nil,false]
end   

这个想法是包装你想要检查的内容,并用数组作出响应,结束时将是“成功”标志。

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  

但这增加了复杂性,并且可能额外的行,但回报很少。我会坚持在需要的时候将通知代码粘贴到救援条款中。