我制作了一个自定义异常处理程序,它在大多数情况下都非常有效。这是它的要点-
应用程序/错误/duck.rb
module Duck
def Duck::ReportError(u,c,m,p)
User.send_error_email(u,c,m,p)
User.msg(m)
end
end
应用程序/邮件程序/通知.rb
def err_report(current_user,err_script,err_msg,err_scrub)
@current_user = current_user
@err_script = err_script
@err_msg = err_msg
@err_scrub = err_scrub
mail(:to => sr_dev, :cc => jr_dev, :subject => "Error Found")
end
这就是我的问题所在 - 上面的代码是目前编写的。有一些小的变化来消除重复。我以前会按如下方式进行调用 - 任何错误都像此示例一样处理,其中将放置在 users_controller.rb 中的所有操作中...
rescue Exception => msg
Duck.ReportError(current_user,"users_controller.rb",msg,"Dumping params: #{params.inspect}")
任何错误都必须导致鸭子调用-因此之前的重复..没有做到这一点。它也完全消除了 DRY,所以我重新编码了 duck.rb 文件,发现通过将它放在应用程序控制器中,任何从 ApplicationController 继承的东西都可以像这样养鸭子——
rescue_from Exception, :with => :any_error
protected
def any_error(msg)
Duck.ReportError(current_user,"application_controller.rb",msg,"Dumping params: #{params.inspect}")
render "home/duck.erb"
end
剩下的代码对于手头的问题来说是微不足道的,那就是:我需要向开发团队展示错误源自哪个文件。当我第一次制作 Duck 时,它是从每个动作/视图/控制器直接调用的,如前所示,这是很多重复,但好处是我可以明确告诉它是哪个脚本产生了错误。现在我已经对错误处理程序进行了一些抽象,这很好——但是每次例如从reports_controller.rb 中出现错误时,它都会将错误报告为来自application_controller.rb。我怎样才能解决这个问题?如何获得错误的实际来源?
系统:
$ rails -v
Rails 3.0.20
$ ruby -v
ruby 1.8.7 (2012-10-12 patchlevel 371) [x86_64-linux]