safely do
# keep going if this code fails
endExceptions are rescued and automatically reported to your favorite reporting service.
In development and test environments, exceptions are raised so you can fix them.
Add this line to your application’s Gemfile:
gem "safely_block"“Oh no, analytics brought down search”
safely { track_search(params) }“Recommendations stopped updating because of one bad user”
users.each do |user|
safely(context: {user_id: user.id}) { update_recommendations(user) }
endAlso aliased as yolo
Pass extra context to be reported with exceptions
safely context: {user_id: 123} do
# code
endSpecify a default value to return on exceptions
show_banner = safely(default: true) { show_banner_logic }Raise specific exceptions
safely except: ActiveRecord::RecordNotUnique do
# all other exceptions will be rescued
endPass an array for multiple exception classes.
Rescue only specific exceptions
safely only: ActiveRecord::RecordNotUnique do
# all other exceptions will be raised
endSilence exceptions
safely silence: ActiveRecord::RecordNotUnique do
# code
endThrottle reporting with:
safely throttle: {limit: 10, period: 1.minute} do
# reports only first 10 exceptions each minute
endNote: The throttle limit is approximate and per process.
Reports exceptions to a variety of services out of the box.
- Airbrake
- Appsignal
- Bugsnag
- Datadog
- Exception Notification
- Google Stackdriver
- Honeybadger
- New Relic
- Raygun
- Rollbar
- Scout APM
- Sentry
Note: Context is not supported with Google Stackdriver and Scout APM
Customize reporting with:
Safely.report_exception_method = ->(e) { Rollbar.error(e) }With Rails, you can add this in an initializer.
By default, exception messages are prefixed with [safely]. This makes it easier to spot rescued exceptions. Turn this off with:
Safely.tag = falseBy default, exceptions are raised in the development and test environments. Change this with:
Safely.raise_envs += ["staging"]To report exceptions manually:
Safely.report_exception(e)To protect the privacy of your users, do not send personal data to exception services. Filter sensitive form fields, use ids (not email addresses) to identify users, and mask IP addresses.
With Rollbar, you can do:
Rollbar.configure do |config|
config.person_id_method = "id" # default
config.scrub_fields |= [:birthday]
config.anonymize_user_ip = true
endWhile working on exceptions, be on the lookout for personal data and correct as needed.
View the changelog
Everyone is encouraged to help improve this project. Here are a few ways you can help:
- Report bugs
- Fix bugs and submit pull requests
- Write, clarify, or fix documentation
- Suggest or add new features
To get started with development and testing:
git clone https://github.com/ankane/safely.git
cd safely
bundle install
bundle exec rake test