класс ActiveSupport::BacktraceCleaner
Обратные трассы часто содержат много строк, не относящихся к контексту, который рассматривается. Это затрудняет поиск сигнала среди шума обратной трассы и увеличивает время отладки. С помощью BacktraceCleaner используются фильтры и глушители для удаления шумных строк, чтобы остались только наиболее релевантные.
Фильтры используются для изменения строк данных, а глушители — для полного удаления строк. Типичный пример использования фильтров — удаление длинной информации о пути из начала каждой строки и отображение путей к файлам, относящимся к каталогу приложения, вместо корня файловой системы. Типичный пример использования глушителей — исключение из обратной трассы вывода шумной библиотеки, чтобы можно было сконцентрироваться на остальном.
bc = BacktraceCleaner.new
bc.add_filter { |line| line.gsub(Rails.root.to_s, '') } # strip the Rails.root prefix
bc.add_silencer { |line| line =~ /mongrel|rubygems/ } # skip any lines from mongrel or rubygems
bc.clean(exception.backtrace) # perform the cleanup
Для переконфигурации существующего BacktraceCleaner (например, по умолчанию в Rails) и отображения максимально возможного количества данных можно всегда вызвать BacktraceCleaner#remove_silencers!, что восстановит обратную трассу в первозданном состоянии. Если вам нужно переконфигурировать существующий BacktraceCleaner так, чтобы он не фильтровал или не изменял пути в строках обратной трассы, можно вызвать BacktraceCleaner#remove_filters! Эти два метода предоставят вам полностью нетронутую обратную трассу.
На основе плагина Quiet Backtrace от Thoughtbot.
Методы класса Public
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 30 def initialize @filters, @silencers = [], [] end
Методы экземпляра Public
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 55 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 64 def add_silencer(&block) @silencers << block end
Добавляет глушитель из предоставленного блока. Если глушитель возвращает true для данной строки, она будет исключена из очищенной обратной трассы.
# Will reject all lines that include the word "mongrel", like "/gems/mongrel/server.rb" or "/app/my_mongrel_server/rb"
backtrace_cleaner.add_silencer { |line| line =~ /mongrel/ }
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 36
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 78 def remove_filters! @filters = [] end
Удаляет все фильтры, но оставляет глушители. Полезно, если вам внезапно нужно увидеть полные пути в обратной трассе, которые вы уже отфильтровали.
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 71 def remove_silencers! @silencers = [] end
Удаляет все глушители, но оставляет фильтры. Полезно, если ваш контекст отладки внезапно расширился, и вы подозреваете ошибку в одной из используемых библиотек.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.