Exception handling and error management

Sarah Mitchell Feb 2026
3 tabs
# Basic exception handling
begin
  result = 10 / 0
rescue ZeroDivisionError => e
  puts "Error: #{e.message}"
  result = nil
end

# Multiple rescue clauses
begin
  # Risky operation
  file = File.open('nonexistent.txt')
rescue Errno::ENOENT => e
  puts "File not found: #{e.message}"
rescue IOError => e
  puts "IO Error: #{e.message}"
rescue StandardError => e
  puts "Standard error: #{e.message}"
ensure
  # Always runs, even if exception occurs
  file&.close
end

# Rescue and retry
attempts = 0
begin
  attempts += 1
  # Network call that might fail
  response = HTTParty.get('https://api.example.com/data')
rescue Net::OpenTimeout, Net::ReadTimeout => e
  if attempts < 3
    sleep(2 ** attempts)  # Exponential backoff
    retry
  else
    raise  # Re-raise after max attempts
  end
end

# Inline rescue
value = risky_method rescue default_value
user = User.find(params[:id]) rescue nil

# Rescue in methods (implicit begin)
def fetch_user(id)
  User.find(id)
rescue ActiveRecord::RecordNotFound
  User.new(name: 'Guest')
end

# Raising exceptions
raise "Something went wrong"
raise ArgumentError, "Invalid argument"
raise ArgumentError.new("Invalid argument")

# Re-raising with modification
begin
  # Operation
rescue StandardError => e
  raise StandardError, "Failed: #{e.message}", e.backtrace
end
3 files · ruby Explain with highlit

Ruby's exception handling uses begin/rescue/ensure/end. I rescue specific exceptions before general ones. rescue catches exceptions; ensure runs cleanup code always. retry attempts operation again; raise re-raises exceptions. Custom exceptions inherit from StandardError. Multiple rescue clauses handle different error types. Exception messages and backtraces aid debugging. I use inline rescue for simple cases—value = risky_method rescue default_value. Rescue modifiers catch and suppress errors—useful but potentially dangerous. Exception handling enables graceful degradation. Proper error management improves robustness and user experience. Understanding Ruby's exception hierarchy guides rescue strategies.