Я создаю API в Rails и столкнулся с ситуацией, когда я хотел бы предупредить пользователя о том, что случилось что-то плохое, передав ему JSON с сообщением об ошибке.Однако я также хотел бы повторно поднять исключение, чтобы Airbrake (ранее Hoptoad) все еще ловил ошибку и уведомлял нас, чтобы мы могли подробнее разобраться с проблемой.
Я сейчасперехватывает ошибку следующим образом:
begin
if @myobject.update_attributes(:foo => "bar")
render :json => @myobject, :status => :ok
else
render :json => @myobject.errors, :status => :unprocessable_entity
end
rescue Exception => e
render :json => { :errors => { :message => "Uh oh! Something went wrong." } }
raise e
end
Проблема в том, что мой клиент никогда не получает сообщение JSON, поскольку raise e
останавливает его рендеринг и отправляет ему общую ошибку 500.
Какя должен это исправить?
[Мое решение]
Как предложено Джорданом ниже, я просто вызываю notify_airbrake(ex)
в своем коде всякий раз, когда я улавливаю исключение.Тем не менее, я немного абстрагировал его, добавив следующее к своему ApplicationController
, чтобы в будущем я мог легко переключиться с Airbrake на что-то другое:
class ApplicationController < ActionController::Base
...
def notify_exception_service(ex)
notify_airbrake(ex)
end
...
end
Итак, вместо notify_airbrake(ex)
я просто звоню notify_exception_service(ex)
.