класс ActiveSupport::BacktraceCleaner
Стек вызовов часто содержит много строк, не относящихся к рассматриваемому контексту. Это затрудняет поиск сигнала среди шума стека вызовов и увеличивает время отладки. С помощью BacktraceCleaner, фильтры и заглушки используются для удаления шумных строк, оставляя только самые важные.
Фильтры используются для модификации строк данных, а заглушки — для полного удаления строк. Типичное применение фильтров — удаление длинных путей из начала каждой строки и отображение путей файлов, относящихся к каталогу приложения, вместо корня файловой системы. Типичное применение заглушек — исключение из стека вызовов вывода шумной библиотеки, чтобы сконцентрироваться на остальном.
bc = ActiveSupport::BacktraceCleaner.new
bc.add_filter { |line| line.gsub(Rails.root.to_s, '') } # strip the Rails.root prefix
bc.add_silencer { |line| line =~ /puma|rubygems/ } # skip any lines from puma or rubygems
bc.clean(exception.backtrace) # perform the cleanup
Чтобы переконфигурировать существующий BacktraceCleaner (например, по умолчанию в Rails) и показать как можно больше данных, вы всегда можете вызвать BacktraceCleaner#remove_silencers!, что восстановит стек вызовов в исходном состоянии. Если вам нужно переконфигурировать существующий BacktraceCleaner таким образом, чтобы он не фильтровал и не изменял пути строк стека вызовов, вы можете вызвать BacktraceCleaner#remove_filters! Эти два метода дадут вам полностью нетронутый стек вызовов.
На вдохновении от драгоценного камня «Тихий стек вызовов» от thoughtbot.
Публичные методы класса
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 32 def initialize @filters, @silencers = [], [] end
Публичные методы экземпляра
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 57 def add_filter(&block) @filters << block end
Добавляет фильтр из предоставленного блока. Каждая строка в стеке вызовов будет сопоставлена с этим фильтром.
# Will turn "/my/rails/root/app/models/person.rb" into "/app/models/person.rb"
backtrace_cleaner.add_filter { |line| line.gsub(Rails.root, '') }
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 66 def add_silencer(&block) @silencers << block end
Добавляет заглушку из предоставленного блока. Если заглушка возвращает true для данной строки, она будет исключена из очищенного стека вызовов.
# Will reject all lines that include the word "puma", like "/gems/puma/server.rb" or "/app/my_puma_server/rb"
backtrace_cleaner.add_silencer { |line| line =~ /puma/ }
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 38
def clean(backtrace, kind = :silent)
filtered = filter_backtrace(backtrace)
case kind
when :silent
silence(filtered)
when :noise
noise(filtered)
else
filtered
end
end Возвращает стек вызовов после применения всех фильтров и заглушек. Фильтры применяются первыми, затем заглушки.
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 80 def remove_filters! @filters = [] end
Удаляет все фильтры, но сохраняет заглушки. Полезно, если внезапно требуется увидеть полные пути файлов в стеке вызовов, которые вы уже отфильтровали.
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 73 def remove_silencers! @silencers = [] end
Удаляет все заглушки, но сохраняет фильтры. Полезно, если ваш контекст отладки внезапно расширился, так как вы подозреваете ошибку в одной из используемых библиотек.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.