是否有一种覆盖默认异常处理(默认救援)的方法,以便我可以在那里编写自定义逻辑,例如将堆栈跟踪发送到我们的Slack通道。
基本上我想做一些NewRelic对他们的gem做的事情:https://github.com/newrelic/rpm但更多本地版本。
由于
答案 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