Spec-Zone.ru › Ruby on Rails 7.0

класс ActiveSupport::ErrorReporter

Родитель:
Object

ActiveSupport::ErrorReporter — это общий интерфейс для служб отчётов об ошибках.

Для перехвата и отчёта об любой необработанной ошибке, вы можете использовать метод handle:

Rails.error.handle do
  do_something!
end

Если возникает ошибка, она будет обработана и проигнорирована.

В качестве альтернативы, если вы хотите отчитаться об ошибке, но не игнорировать её, вы можете использовать record:

Rails.error.record do
  do_something!
end

Оба метода могут быть ограничены для обработки только определённого класса исключения

maybe_tags = Rails.error.handle(Redis::BaseError) { redis.get("tags") }

Вы также можете передать дополнительную контекстную информацию, которая может быть использована подписчиками ошибок:

Rails.error.handle(context: { section: "admin" }) do
  # ...
end

Кроме того, severity может быть передан для указания важности отчёта об ошибке. severity может быть одним из значений :warning, :error или :info. Обработанные ошибки по умолчанию имеют уровень важности :warning, а необработанные — error.

Оба handle и record передают возвращаемое значение из блока. В случае handle перехвата ошибки, можно указать резервное решение. Резервное решение должно быть вызываемым объектом, результат которого будет возвращён, когда блок генерирует ошибку и она обрабатывается:

user = Rails.error.handle(fallback: -> { User.anonymous }) do
  User.find_by(params)
end

Постоянные

SEVERITIES

Атрибуты

logger[RW]

Открытые методы класса

new(*subscribers, logger: nil) Показать исходный код
# File activesupport/lib/active_support/error_reporter.rb, line 46
def initialize(*subscribers, logger: nil)
  @subscribers = subscribers.flatten
  @logger = logger
end

Открытые методы экземпляра

handle(error_class = StandardError, severity: :warning, context: {}, fallback: nil) { || ... } Показать исходный код
# File activesupport/lib/active_support/error_reporter.rb, line 57
def handle(error_class = StandardError, severity: :warning, context: {}, fallback: nil)
  yield
rescue error_class => error
  report(error, handled: true, severity: severity, context: context)
  fallback.call if fallback
end

Отправить отчёт о любой необработанной ошибке и проигнорировать её.

Rails.error.handle do
  1 + '1'
end
record(error_class = StandardError, severity: :error, context: {}) { || ... } Показать исходный код
# File activesupport/lib/active_support/error_reporter.rb, line 64
def record(error_class = StandardError, severity: :error, context: {})
  yield
rescue error_class => error
  report(error, handled: false, severity: severity, context: context)
  raise
end
report(error, handled:, severity: handled ? :warning : :error, context: {}) Показать исходный код
# File activesupport/lib/active_support/error_reporter.rb, line 95
def report(error, handled:, severity: handled ? :warning : :error, context: {})
  unless SEVERITIES.include?(severity)
    raise ArgumentError, "severity must be one of #{SEVERITIES.map(&:inspect).join(", ")}, got: #{severity.inspect}"
  end

  full_context = ActiveSupport::ExecutionContext.to_h.merge(context)
  @subscribers.each do |subscriber|
    subscriber.report(error, handled: handled, severity: severity, context: full_context)
  rescue => subscriber_error
    if logger
      logger.fatal(
        "Error subscriber raised an error: #{subscriber_error.message} (#{subscriber_error.class})\n" +
        subscriber_error.backtrace.join("\n")
      )
    else
      raise
    end
  end

  nil
end

Когда методы handle и record на основе блоков не подходят, вы можете напрямую использовать report.

Rails.error.report(error, handled: true)
set_context(...) Показать исходный код
# File activesupport/lib/active_support/error_reporter.rb, line 88
def set_context(...)
  ActiveSupport::ExecutionContext.set(...)
end

Обновить контекст выполнения, доступный подписчикам ошибок

Rails.error.set_context(section: "checkout", user_id: @user.id)

См. ActiveSupport::ExecutionContext.set

subscribe(subscriber) Показать исходный код
# File activesupport/lib/active_support/error_reporter.rb, line 76
def subscribe(subscriber)
  unless subscriber.respond_to?(:report)
    raise ArgumentError, "Error subscribers must respond to #report"
  end
  @subscribers << subscriber
end

Зарегистрировать нового подписчика ошибок. Подписчик должен отвечать на

report(Exception, handled: Boolean, context: Hash)

Метод report should никогда не генерирует ошибку.

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

Spec-Zone.ru

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