Exceptions help your program handle errors without crashing. The exception hierarchy organizes these errors so you can catch and fix them easily.
Exception hierarchy in Ruby
begin # code that might cause an error rescue ExceptionType => e # code to handle the error end
begin starts the block where errors might happen.
rescue catches errors of a specific type or its subtypes.
begin 1 / 0 rescue ZeroDivisionError => e puts "Cannot divide by zero!" end
begin [].fetch(1) rescue IndexError => e puts "Index is out of range!" end
begin raise StandardError, "Oops!" rescue StandardError => e puts e.message end
This program tries to open a file that does not exist. It catches different errors based on Ruby's exception hierarchy.
begin puts "Trying to open a file..." File.open("nonexistent.txt") rescue IOError => e puts "IO error happened: #{e.message}" rescue SystemCallError => e puts "System call error happened: #{e.message}" rescue Exception => e puts "Some other error: #{e.message}" end
All error classes in Ruby inherit from Exception.
StandardError is the default for rescue if no exception type is given.
Use specific exceptions first, then more general ones to avoid catching errors too broadly.
Exceptions are organized in a hierarchy starting from Exception.
You can catch errors by their type or any of their parent types.
Handling exceptions helps keep your program running smoothly even when errors happen.
Practice
Which class is the root of the exception hierarchy in Ruby?
Solution
Step 1: Understand Ruby's exception hierarchy
In Ruby, all exceptions inherit from theExceptionclass, which is the root of the hierarchy.Step 2: Identify the root class
Other exception classes likeStandardErrorandRuntimeErrorare subclasses ofException.Final Answer:
Exception -> Option CQuick Check:
Root exception class = Exception [OK]
- Confusing StandardError as root
- Thinking RuntimeError is root
- Choosing specific error classes instead of root
Which of the following is the correct way to rescue only StandardError exceptions in Ruby?
begin # some code rescue ??? puts 'Error caught' end
Solution
Step 1: Understand rescue syntax
Therescuekeyword can specify which exception class to catch by naming it afterrescue.Step 2: Choose the correct exception class
To catch onlyStandardErrorexceptions, writerescue StandardError.Final Answer:
StandardError -> Option AQuick Check:
Rescue specific error = StandardError [OK]
- Using Exception catches too many errors
- Using RuntimeError misses other StandardErrors
- Using IOError catches unrelated errors
What will be the output of this Ruby code?
begin raise IOError, 'File error' rescue StandardError => e puts e.class end
Solution
Step 1: Identify the raised exception
The code raises anIOErrorwith message 'File error'.Step 2: Check rescue clause
The rescue catchesStandardErrorand its subclasses.IOErroris a subclass ofStandardError, so it is caught.Step 3: Output the exception class
The code printse.class, which isIOError.Final Answer:
IOError -> Option DQuick Check:
Raised error class = IOError [OK]
- Assuming rescue prints StandardError
- Confusing Exception with StandardError
- Thinking RuntimeError is printed
Find the error in this Ruby code snippet:
begin raise 'Oops!' rescue IOError puts 'IO error caught' end
Solution
Step 1: Analyze the raised error
Raising with a string'Oops!'creates aRuntimeErrorby default.Step 2: Check rescue clause type
The rescue only catchesIOError, but the raised error isRuntimeError, so it is not caught.Final Answer:
The rescue clause will not catch the raised error -> Option BQuick Check:
Rescue type mismatch causes uncaught error [OK]
- Thinking rescue catches all errors by default
- Believing string raise is invalid syntax
- Assuming rescue syntax is wrong
You want to catch all exceptions except system-exiting ones like SystemExit and Interrupt. Which class should you rescue to catch most errors but allow system exits?
Solution
Step 1: Understand exception classes for system exit
Classes likeSystemExitandInterruptinherit directly fromException, notStandardError.Step 2: Choose rescue class to exclude system exits
RescuingStandardErrorcatches most runtime errors but excludes system-exiting exceptions.Step 3: Confirm other options
RescuingExceptioncatches everything including system exits, which is usually not desired.Final Answer:
StandardError -> Option AQuick Check:
Rescue StandardError to exclude system exits [OK]
- Rescuing Exception catches system exits too
- Choosing RuntimeError misses some errors
- Confusing NoMethodError as base class
Ready to prove it?
Pass the test and this pattern moves unknown
