If an exception is raised in ensure, what happens?
AIt replaces any previous exception
BThe program exits silently
CIt is caught by <code>rescue</code>
DIt is ignored
✗ Incorrect
Exceptions in ensure override previous exceptions and propagate.
Where should you put code to close a file to ensure it always runs?
AInside <code>begin</code>
BInside <code>ensure</code>
CInside <code>rescue</code>
DOutside all blocks
✗ Incorrect
Closing files should be in ensure to guarantee execution.
What will this code print?
begin
puts 'Hello'
ensure
puts 'Goodbye'
end
AHello
Goodbye
BGoodbye
CHello
DGoodbye
Hello
✗ Incorrect
Both puts run; ensure runs after begin.
Explain how the ensure block works in Ruby and why it is important for cleanup.
Think about what happens when errors occur and you still want to clean up.
You got /4 concepts.
Describe the difference between rescue and ensure blocks in Ruby exception handling.
One catches errors, the other guarantees code runs.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of the ensure block in Ruby?
easy
A. To run code that must execute regardless of errors
B. To catch exceptions and handle them
C. To define a method inside a class
D. To start a loop that repeats code
Solution
Step 1: Understand the role of ensure
The ensure block runs code no matter what happens in the begin block, even if an error occurs.
Step 2: Compare with other blocks
Unlike rescue which handles errors, ensure always runs for cleanup tasks.
Final Answer:
To run code that must execute regardless of errors -> Option A
Quick Check:
ensure = always runs cleanup [OK]
Hint: Remember: ensure always runs, even after errors [OK]
Common Mistakes:
Confusing ensure with rescue
Thinking ensure only runs on errors
Using ensure to catch exceptions
2. Which of the following is the correct syntax to use ensure in Ruby?
easy
A. if
# code
else
# cleanup code
end
B. try
# code
finally
# cleanup code
end
C. begin
# code
rescue
# cleanup code
end
D. begin
# code
ensure
# cleanup code
end
Solution
Step 1: Identify Ruby's syntax for ensure
Ruby uses begin ... ensure ... end to guarantee cleanup code runs.
Step 2: Eliminate other language or incorrect syntax
Options B and D use non-Ruby keywords; C uses rescue which is for error handling, not guaranteed cleanup.
Final Answer:
begin
# code
ensure
# cleanup code
end -> Option D
Quick Check:
Ruby ensure syntax = begin ... ensure ... end [OK]
Hint: Use begin ... ensure ... end for guaranteed cleanup [OK]
Common Mistakes:
Using try/finally (not Ruby syntax)
Confusing rescue with ensure
Using if/else for cleanup
3. What will be the output of this Ruby code?
def test
begin
puts "Start"
raise "Error!"
ensure
puts "Cleanup"
end
end
test
medium
A. Start\nCleanup\nRuntimeError: Error!
B. Start\nRuntimeError: Error!\nCleanup
C. Cleanup\nStart\nRuntimeError: Error!
D. Start\nCleanup
Solution
Step 1: Trace the code execution
The method prints "Start", then raises an error. The ensure block runs next, printing "Cleanup".
Step 2: Understand error propagation
After ensure, the error is not rescued, so it propagates and shows the RuntimeError message.
Final Answer:
Start\nCleanup\nRuntimeError: Error! -> Option A
Quick Check:
ensure runs before error propagates [OK]
Hint: Ensure runs before error stops program [OK]
Common Mistakes:
Thinking ensure stops error
Assuming cleanup prints after error message
Ignoring error propagation
4. Identify the error in this Ruby code using ensure:
begin
puts "Processing"
# missing end for begin
ensure
puts "Cleaning up"
end
medium
A. Cannot use ensure without rescue
B. Missing end for begin block
C. The puts statements are invalid inside ensure
D. The ensure block must come before begin
Solution
Step 1: Check block structure
The begin block is missing its closing end before ensure.
Step 2: Understand ensure placement
ensure must be inside the begin ... end block, so the missing end causes a syntax error.
Final Answer:
Missing end for begin block -> Option B
Quick Check:
Every begin needs matching end [OK]
Hint: Count your begin and end keywords carefully [OK]
Common Mistakes:
Thinking ensure needs rescue
Placing ensure outside begin-end
Assuming puts invalid in ensure
5. You want to open a file, write data, and always close it even if an error occurs. Which Ruby code correctly uses ensure for this cleanup?
hard
A. begin
file = File.open('data.txt', 'w')
file.write('Hello')
rescue
file.close
end
B. file = File.open('data.txt', 'w')
file.write('Hello')
file.close
C. file = File.open('data.txt', 'w')
begin
file.write('Hello')
ensure
file.close
end
D. begin
file = File.open('data.txt', 'w')
file.write('Hello')
ensure
file = nil
end
Solution
Step 1: Identify correct use of ensure for cleanup
file = File.open('data.txt', 'w')
begin
file.write('Hello')
ensure
file.close
end opens the file before begin, writes inside, and closes in ensure, guaranteeing closure.
Step 2: Check other options for errors
begin
file = File.open('data.txt', 'w')
file.write('Hello')
rescue
file.close
end closes in rescue, which only runs on errors, not always. file = File.open('data.txt', 'w')
file.write('Hello')
file.close doesn't handle errors. begin
file = File.open('data.txt', 'w')
file.write('Hello')
ensure
file = nil
end sets file to nil but doesn't close it.
Final Answer:
file = File.open('data.txt', 'w')
begin
file.write('Hello')
ensure
file.close
end -> Option C
Quick Check:
Ensure always closes file [OK]
Hint: Put cleanup like file.close inside ensure [OK]
Common Mistakes:
Closing file only in rescue block
Not closing file on error
Setting variable to nil instead of closing
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.