Active Support 错误报告器
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") }
- D
- H
- N
- R
- S
- U
常量
DEFAULT_SOURCE | = | "application" |
SEVERITIES | = | %i(error warning info) |
属性
[RW] | logger |
类公共方法
new(*subscribers, logger: nil) 链接
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/error_reporter.rb, line 32 def initialize(*subscribers, logger: nil) @subscribers = subscribers.flatten @logger = logger end
实例公共方法
disable(subscriber) 链接
在块持续期间阻止订阅者收到错误通知。你可以传入订阅者本身或其类。
当错误报告服务集成希望处理堆栈中更高级别的任何错误时,这可能很有用。
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/error_reporter.rb, line 147 def disable(subscriber) disabled_subscribers = (ActiveSupport::IsolatedExecutionState[self] ||= []) disabled_subscribers << subscriber begin yield ensure disabled_subscribers.delete(subscriber) end end
handle(*error_classes, severity: :warning, context: {}, fallback: nil, source: DEFAULT_SOURCE) 链接
评估给定的块,报告并吞下任何未处理的错误。如果没有引发错误,则返回块的返回值。否则,返回fallback.call
的结果,或者如果未指定fallback
,则返回nil
。
# Will report a TypeError to all subscribers and return nil.
Rails.error.handle do
1 + '1'
end
可以限制仅处理特定的错误类
maybe_tags = Rails.error.handle(Redis::BaseError) { redis.get("tags") }
选项
-
:severity
- 此值传递给订阅者以指示错误报告的重要性。可以是:error
、:warning
或:info
。默认为:warning
。 -
:context
- 传递给订阅者的额外信息。例如Rails.error.handle(context: { section: "admin" }) do # ... end
-
:fallback
- 当引发未处理的错误时提供handle
返回值的可调用对象。例如user = Rails.error.handle(fallback: -> { User.anonymous }) do User.find_by(params) end
-
:source
- 此值传递给订阅者以指示错误的来源。订阅者可以使用此值忽略某些错误。默认为"application"
。
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/error_reporter.rb, line 74 def handle(*error_classes, severity: :warning, context: {}, fallback: nil, source: DEFAULT_SOURCE) error_classes = [StandardError] if error_classes.blank? yield rescue *error_classes => error report(error, handled: true, severity: severity, context: context, source: source) fallback.call if fallback end
record(*error_classes, severity: :error, context: {}, source: DEFAULT_SOURCE) 链接
评估给定的块,报告并重新引发任何未处理的错误。如果没有引发错误,则返回块的返回值。
# Will report a TypeError to all subscribers and re-raise it.
Rails.error.record do
1 + '1'
end
可以限制仅处理特定的错误类
tags = Rails.error.record(Redis::BaseError) { redis.get("tags") }
选项
-
:severity
- 此值传递给订阅者以指示错误报告的重要性。可以是:error
、:warning
或:info
。默认为:error
。 -
:context
- 传递给订阅者的额外信息。例如Rails.error.record(context: { section: "admin" }) do # ... end
-
:source
- 此值传递给订阅者以指示错误的来源。订阅者可以使用此值忽略某些错误。默认为"application"
。
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/error_reporter.rb, line 110 def record(*error_classes, severity: :error, context: {}, source: DEFAULT_SOURCE) error_classes = [StandardError] if error_classes.blank? yield rescue *error_classes => error report(error, handled: false, severity: severity, context: context, source: source) raise end
report(error, handled: true, severity: handled ? :warning : :error, context: {}, source: DEFAULT_SOURCE) 链接
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/error_reporter.rb, line 172 def report(error, handled: true, severity: handled ? :warning : :error, context: {}, source: DEFAULT_SOURCE) return if error.instance_variable_defined?(:@__rails_error_reported) 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) disabled_subscribers = ActiveSupport::IsolatedExecutionState[self] @subscribers.each do |subscriber| unless disabled_subscribers&.any? { |s| s === subscriber } subscriber.report(error, handled: handled, severity: severity, context: full_context, source: source) end 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 unless error.frozen? error.instance_variable_set(:@__rails_error_reported, true) end nil end
set_context(...) 链接
更新错误订阅者可以访问的执行上下文。传递给handle
、record
或report
的任何上下文都将与此处设置的上下文合并。
Rails.error.set_context(section: "checkout", user_id: @user.id)
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/error_reporter.rb, line 163 def set_context(...) ActiveSupport::ExecutionContext.set(...) end
subscribe(subscriber) 链接
注册新的错误订阅者。订阅者必须响应
report(Exception, handled: Boolean, severity: (:error OR :warning OR :info), context: Hash, source: String)
report
方法绝不应引发错误。
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/error_reporter.rb, line 123 def subscribe(subscriber) unless subscriber.respond_to?(:report) raise ArgumentError, "Error subscribers must respond to #report" end @subscribers << subscriber end
unsubscribe(subscriber) 链接
取消注册错误订阅者。接受订阅者或类。
subscriber = MyErrorSubscriber.new
Rails.error.subscribe(subscriber)
Rails.error.unsubscribe(subscriber)
# or
Rails.error.unsubscribe(MyErrorSubscriber)
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/error_reporter.rb, line 138 def unsubscribe(subscriber) @subscribers.delete_if { |s| subscriber === s } end