Spec-Zone.ru › Ruby on Rails 7.1

класс ActiveSupport::BacktraceCleaner

Родитель:
Object

Очиститель стека вызовов

Стеки вызовов часто содержат много строк, не относящихся к рассматриваемому контексту. Это затрудняет поиск сигнала среди шума стека вызовов и увеличивает время отладки. С помощью BacktraceCleaner, используются фильтры и заглушки для удаления бесполезных строк, оставляя только самые релевантные.

Фильтры используются для изменения данных строк, а заглушки — для полного удаления строк. Типичный пример использования фильтров — удаление длинной информации о пути из начала каждой строки и отображение путей файлов, относящихся к каталогу приложения, вместо корня файловой системы. Типичный пример использования заглушек — исключение из стека вызовов вывода шумной библиотеки, чтобы сосредоточиться на остальной части.

bc = ActiveSupport::BacktraceCleaner.new
bc.add_filter   { |line| line.gsub(Rails.root.to_s, '') } # strip the Rails.root prefix
bc.add_silencer { |line| /puma|rubygems/.match?(line) } # skip any lines from puma or rubygems
bc.clean(exception.backtrace) # perform the cleanup

Для переконфигурации существующего BacktraceCleaner (например, по умолчанию в Rails) и отображения максимального количества данных, всегда можно вызвать BacktraceCleaner#remove_silencers!, что восстановит стек вызовов в первоначальное состояние. Если вам нужно переконфигурировать существующий BacktraceCleaner так, чтобы он не фильтровал или не изменял пути строк стека вызовов, можно вызвать BacktraceCleaner#remove_filters!. Эти два метода предоставят вам полностью нетронутый стек вызовов.

Вдохновлён драгоценным камнем «Quiet Backtrace» от thoughtbot.

Константы

FORMATTED_GEMS_PATTERN

Публичные методы класса

new() Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 34
def initialize
  @filters, @silencers = [], []
  add_gem_filter
  add_gem_silencer
  add_stdlib_silencer
end

Публичные методы экземпляра

add_filter(&block) Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 80
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.to_s, '') }
add_silencer(&block) Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 89
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| /puma/.match?(line) }
clean(backtrace, kind = :silent) Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 43
def clean(backtrace, kind = :silent)
  filtered = filter_backtrace(backtrace)

  case kind
  when :silent
    silence(filtered)
  when :noise
    noise(filtered)
  else
    filtered
  end
end

Возвращает стек вызовов после применения всех фильтров и заглушек. Фильтры применяются в первую очередь, затем заглушки.

Также алиас: filter
clean_frame(frame, kind = :silent) Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 59
def clean_frame(frame, kind = :silent)
  frame = frame.to_s
  @filters.each do |f|
    frame = f.call(frame.to_s)
  end

  case kind
  when :silent
    frame unless @silencers.any? { |s| s.call(frame) }
  when :noise
    frame if @silencers.any? { |s| s.call(frame) }
  else
    frame
  end
end

Возвращает кадр с применёнными всеми фильтрами. Возвращает nil если кадр был заглушён.

filter(backtrace, kind = :silent)
Псевдоним для: clean
remove_filters!() Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 103
def remove_filters!
  @filters = []
end

Удаляет все фильтры, но оставляет заглушки. Полезно, если внезапно требуется увидеть полные пути файлов в стеке вызовов, которые вы уже отфильтровали.

remove_silencers!() Показать исходный код
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 96
def remove_silencers!
  @silencers = []
end

Удаляет все заглушки, но оставляет фильтры. Полезно, если ваш контекст отладки внезапно расширился, и вы подозреваете ошибку в одной из используемых библиотек.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API