В нашем приложении Rails мы используем Airbrake, подключенный к размещенному серверу Errbit.
Мы используем rescue
и 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
?