класс ActiveSupport::ErrorReporter
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
Атрибуты
Открытые методы класса
# File activesupport/lib/active_support/error_reporter.rb, line 46 def initialize(*subscribers, logger: nil) @subscribers = subscribers.flatten @logger = logger end
Открытые методы экземпляра
# 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
# 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 # 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)
# 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
# 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.