ruby-on-rails - 捕获异常并手动记录错误时通知 Airbrake
问题描述
在我们的 Rails 应用程序中,我们使用 Airbrake 连接到托管的 Errbit 服务器。
我们在很多地方都使用rescue
and来以特定方式处理任何异常,然后在返回响应之前我们自己记录异常。rescue_from
我们的一些例子ApplicationController
:
rescue_from CanCan::AccessDenied do |e|
Rails.logger.error "CanCan exception: #{e.message}"
render 'errors/401', status: 401
end
rescue_from ActionController::InvalidAuthenticityToken do |e|
Rails.logger.error "Authenticity exception: #{e.message}"
render 'errors/csrf', status: 400
end
然后我们还有一些单独的方法,例如 API:
def try_request
Response.new(yield)
rescue RestClient::Unauthorized,
RestClient::ExceptionWithResponse,
RestClient::InternalServerError,
RestClient::BadRequest => e
Rails.logger.error "API exception: #{e.message}"
Response.new(e.response)
end
然而,通过使用rescue
我们注意到 Errbit 不再接收我们的异常,因为我们正在捕获它们......这很有意义......但我们仍然希望在我们的 Errbit 报告中看到这些!
您可以通过以下方式手动通知 Airbrake:
Airbrake.notify(e)
但我们希望避免将这段代码放在每个救援块中。
是否有可能有一个更高级别的语句可以在手动记录错误时自动通知 Airbrake?也许调用时Rails.logger.error
调用的中间件?
解决方案
rescue
是 ruby 子句,你不能直接覆盖它(即使你可以 - 这不是一个好主意)
在你所有的例子中Rails.logger.error
,你可以让自己成为一个助手,比如:
module MyErrorNotifier
def self.notify(message, exception, params = {}, &block)
Rails.logger.error("#{message}: #{exception.message}")
Airbrake.notify(exception, params, &block)
end
end
而不是记录器调用它:
def try_request
...
rescue e
MyErrorNotifier.notify("Foo exception happened", e)
Response.new(e.response)
end
推荐阅读
- java - 为什么 TextView 不能显示从 android 资源引用的格式化文本?
- sql-server - 如何在同一时间同时执行相同的作业
- r - 如何在 R Markdown 中的 params 语句之前加载库或使用某个库中的表达式为 params 提供默认值
- c++ - const char* 向量的新值没有得到 push_back()
- javascript - 如何使用 javascript 启动 httplistener
- java - SpringBoot 2.1.4.RELEASE WebApp中的登录错误
- scala - 如何使用 Scalatra 进行默认响应 Content-type: application/json
- postgresql - Docker,错误:无法运行迁移:数据库需要引导;
- python - Python 正则表达式帮助
- java - java中的通用接口继承