Exceptions are just classes in Ruby. The exception exception hierarchy is made up of all the classes that inherit from Exception.
Here's a the exception hierarchy for Ruby 2.1's standard library.
Exception
NoMemoryError
ScriptError
LoadError
NotImplementedError
SyntaxError
SecurityError
SignalException
Interrupt
StandardError -- default for rescue
ArgumentError
UncaughtThrowError
EncodingError
FiberError
IOError
EOFError
IndexError
KeyError
StopIteration
LocalJumpError
NameError
NoMethodError
RangeError
FloatDomainError
RegexpError
RuntimeError -- default for raise
SystemCallError
Errno::*
ThreadError
TypeError
ZeroDivisionError
SystemExit
SystemStackError
Practical uses
The reason that exceptions are arranged into a class tree is so that you can easily rescue similar types of exception.
For example, consider the code:
begin
do_something
rescue StandardError => e
end
This will rescue not only StandardError, but also any exception that inherits from it. That happens to be pretty much any exception you'll be interested in.
In your own code, you might have all of your custom exceptions inherit from a single base class:
module MyLib
class Error < StandardError
end
class TimeoutError < Error
end
class ConnectionError < Error
end
end
...
begin
do_something
rescue MyLib::Error => e
# Rescues any of the exceptions defined above
end