New error reporting in rails 7
While working through a bug where we were getting duplicate errors reported by sidekiq in honeybadger I learned about a new feature that was released in rails 7, but wasn’t documented. Have you ever written some code like this example below where you want to rescue an exception and still report to your error reporting service like honeybadger or sentry?
begin do_something rescue SomethingIsBroken => error MyErrorReportingService.notify(error) end
Well a new feature was added in rails called Error Reporting, and now we have a simple consistent way of doing this in rails.
Rails.error.handle(SomethingIsBroken) do do_something end
The code above will handle the error if
do_something raises an error and rails
will automagically send it to the reporting service you are using in your app.
To create a subscriber for the error reporting you just create an intializer
like this. As of now honeybadger and sentry both create a subscriber for you so
you can skip this if you use either of them.
# config/initializers/error_subscriber.rb class ErrorSubscriber def report(error, handled:, severity:, context:, source: nil) MyErrorReportingService.report_error(error, context: context, handled: handled, level: severity) end end Rails.error.subscribe(ErrorSubscriber.new)
Thats it, now you can use the consistent
Rails.error.handle block when
handling errors in your app and rails will make sure it gets sent to the
subscribed error reporting service.
It will be in the docs for the next release of rails also, for now check out the rails error reporting docs in rails edge guides.