我正在尝试发送所有铁路错误作为通知,而不会打扰其他救援。
的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)
。
答案 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
但这增加了复杂性,并且可能额外的行,但回报很少。我会坚持在需要的时候将通知代码粘贴到救援条款中。