首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在捕获异常并手动记录错误时通知Airbrake

在捕获异常并手动记录错误时通知Airbrake
EN

Stack Overflow用户
提问于 2020-04-17 18:33:01
回答 1查看 304关注 0票数 1

在我们的Rails应用程序中,我们使用连接到托管Errbit服务器的Airbrake。

我们在很多地方使用rescuerescue_from,在这些地方我们希望以特定的方式处理任何异常,然后在返回响应之前自己记录异常。

我们的ApplicationController中有一些示例

代码语言:javascript
复制
  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:

代码语言:javascript
复制
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不再拾取我们的execeptions,因为我们正在捕获它们……有道理..。但是我们仍然希望在Errbit报告中看到这些!

您可以使用以下命令手动通知Airbrake:

代码语言:javascript
复制
Airbrake.notify(e)

但我们希望避免把这些代码放在每一个救援块中。

有没有可能有一个更高级别的语句,可以在手动记录错误时自动通知Airbrake?也许是在调用Rails.logger.error时调用的中间件?

EN

回答 1

Stack Overflow用户

发布于 2020-12-22 00:18:08

rescue是ruby子句,您不能直接覆盖它(即使您可以-这也不是一个好主意)

在您的所有示例中都有Rails.logger.error,您可以让自己成为一个助手,如下所示:

代码语言:javascript
复制
module MyErrorNotifier
  def self.notify(message, exception, params = {}, &block)
    Rails.logger.error("#{message}: #{exception.message}")
    Airbrake.notify(exception, params, &block)
  end
end

而不是记录器,调用它:

代码语言:javascript
复制
def try_request
 ...
rescue e
  MyErrorNotifier.notify("Foo exception happened", e)
  Response.new(e.response)
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61269489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档