Exceptions

Raise

The keyword raise stops the program with an error object. A plain string becomes a RuntimeError carrying that message. Naming a class with a message pinpoints the failure more precisely.

raise "boom" raise ArgumentError, "bad input"

Left alone, either line ends the program and prints the message with a backtrace.

Rescue

The keywords begin and rescue wrap risky code: the rescue branch runs when the body raises. Naming an error class catches only that family, while other errors keep traveling upward. Match the class to the failures you truly expect.

begin raise "boom" rescue RuntimeError puts "caught" end

caught

Ensure always runs

The keyword ensure closes a begin block with cleanup that always runs: after success, after a rescued failure, and even when an unexpected error escapes. Closing files and releasing locks belongs there.

begin raise "boom" rescue RuntimeError puts "caught" ensure puts "cleanup" end

caught
cleanup

Your own error class

Subclassing StandardError defines an error type of your own, carrying the intent of the domain. Rescuing it by name keeps application failures apart from ordinary bugs. Give the class a clear name so future readers grasp the rescue at a glance.

class AppError < StandardError end begin raise AppError, "nope" rescue AppError puts "app failed" end

app failed

Next: Debugging

Article author: Arthur Isaev