Skip to content
/ safely Public

Rescue and report exceptions in non-critical code

License

Notifications You must be signed in to change notification settings

ankane/safely

Repository files navigation

Safely

safely do
  # keep going if this code fails
end

Exceptions are rescued and automatically reported to your favorite reporting service.

In development and test environments, exceptions are raised so you can fix them.

Read more

Build Status

Installation

Add this line to your application’s Gemfile:

gem "safely_block"

Use It Everywhere

“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) }
end

Also aliased as yolo

Features

Pass extra context to be reported with exceptions

safely context: {user_id: 123} do
  # code
end

Specify 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
end

Pass an array for multiple exception classes.

Rescue only specific exceptions

safely only: ActiveRecord::RecordNotUnique do
  # all other exceptions will be raised
end

Silence exceptions

safely silence: ActiveRecord::RecordNotUnique do
  # code
end

Throttle reporting with:

safely throttle: {limit: 10, period: 1.minute} do
  # reports only first 10 exceptions each minute
end

Note: The throttle limit is approximate and per process.

Reporting

Reports exceptions to a variety of services out of the box.

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 = false

By default, exceptions are raised in the development and test environments. Change this with:

Safely.raise_envs = %w(development test staging)

To report exceptions manually:

Safely.report_exception(e)

Data Protection

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
end

While working on exceptions, be on the lookout for personal data and correct as needed.

History

View the changelog

Contributing

Everyone is encouraged to help improve this project. Here are a few ways you can help:

To get started with development and testing:

git clone https://github.com/ankane/safely.git
cd safely
bundle install
bundle exec rake test

About

Rescue and report exceptions in non-critical code

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages