捕获异常应用程序范围

时间:2017-04-03 12:24:12

标签: ruby-on-rails ruby

是否有一种覆盖默认异常处理(默认救援)的方法,以便我可以在那里编写自定义逻辑,例如将堆栈跟踪发送到我们的Slack通道。

基本上我想做一些NewRelic对他们的gem做的事情:https://github.com/newrelic/rpm但更多本地版本。

由于

2 个答案:

答案 0 :(得分:1)

您可以做的最简单的事情是使用TracePoint设置所有错误提升:

trace = TracePoint.new(:raise) do |tp|
    myLogger.log [tp.lineno, tp.event, tp.raised_exception]
end

trace.enable

使用用于导致重要代码减速的跟踪。我认为ruby 2.0中的新API显着降低了速度。根据我天真的基准:

count = 10_000_000


t = Time.now
count.times do |i|
  begin
    0 / 0
  rescue
  end
end
puts "trial 1: #{Time.now - t}"


t = Time.now
count.times do |i|
  "hi"
  begin
    0 / 0
  rescue
  end
end
puts "trial 2: #{Time.now - t}"


trace = TracePoint.new(:raise) do |tp|
  "hi"
end
trace.enable

t = Time.now
count.times do |i|
  begin
    0 / 0
  rescue
  end
end
puts "trial 3: #{Time.now - t}"

#=>trial 1: 10.110471094
#=>trial 2: 9.971755759
#=>trial 3: 11.608365399

Tracepoint仅在10,000,000次加注执行中增加1秒(或10%)减速。话虽这么说,TracePoint仍然不被认为是一种生产价值的技术"因为它 会增加开销并且难以预测(例如ruby中有很多模糊的例外)。

如果您想知道新遗物如何设法在没有开销的情况下设计代码:

...
class_eval <<-EOC
  def #{with_method_name}(*args, &block)
    perform_action_with_newrelic_trace(#{argument_list.join(',')}) do
      #{without_method_name}(*args, &block)
     end
  end
EOC
...

它使用数百行元编程来捕获特定方法,解构它们,并使用内部仪器重新定义它们。这种技术需要大量的代码和(我会假设)启动时额外的内存和时间,但是一旦分配了方法就没有额外开销的优势。

答案 1 :(得分:0)

application_controller.rb

中尝试类似的操作
rescue_from Exception, with: :rescue500 if Rails.env.production?

rescue_from ActiveRecord::RecordNotFound, with: :record_not_found unless Rails.env.development?



     def record_not_found
        render json: {code: 404, errors: ["Record not found"]}, status: 404
      end

      def rescue404
        render json: {code: 404, errors: ["No round matches"]}, status: 404
      end

      def rescue500(ex)
        Rails.logger.error("\n\nEXCEPTION: #{ex.inspect}\n")
        Rails.logger.info(ex)
        render json: {code: 500, errors: [ex.message] }, status: 500
      end