Ensure
In Ruby, the ensure
keyword is used in exception handling to ensure that a certain block of code is always executed regardless of whether an exception is raised or not.
Besides, it provides a mechanism for cleanup or finalization tasks, guaranteeing that essential actions such as releasing resources or providing feedback are carried out consistently.
Exception handling
The structure
begin
# Code that might raise an exception
rescue SomeError => e
# Code to handle the exception
else
# Code that is executed when there's no exception
ensure
# Code that is always executed, whether an exception is raised or not
end
begin
This keyword marks the beginning of a block of code where exceptions might occur. Inside this block, you place the code that could potentially raise an exception.
rescue SomeError => e
In this line, rescue is used to catch any exceptions that occur within the begin block.
SomeError is the class of the exception that you want to catch. You can replace SomeError with the specific type of exception you expect to handle, or you can use StandardError
to catch any standard exceptions. The => e
part assigns the exception object to the variable e
, allowing you to access information about the exception.
else
This keyword introduces a block of code that is executed when there is no exception raised within the begin block. If no exception occurs, the code within the else block will be executed. This block is optional and is skipped if an exception occurs.
ensure
This keyword introduces a block of code that is always executed, regardless of whether an exception was raised or not. It ensures that certain cleanup or finalization tasks are performed, such as closing files, releasing resources, or any other actions that should happen regardless of the program's flow.
Basic execution with no exception
Take a look at the following initial structure
begin
puts "begin"
rescue StandandError => e
puts "rescue"
else
puts "else"
ensure
puts "ensure"
end
The following code returns
begin
else
ensure
The begin
keyword marks the beginning of the block where code execution starts.
Since there is no error raised in the begin block, the rescue
block is skipped.
Since no exception was raised, the else
block is executed. It prints "else
" to the console. The ensure
block is always executed regardless of whether an exception was raised or not. It prints "ensure
" to the console.
Basic execution with an exception raised
Take a look at the following initial structure
begin
puts "begin"
raise
rescue
puts "rescue"
else
puts "else"
ensure
puts "ensure"
end
The following code returns
begin
rescue
ensure
The begin
keyword marks the beginning of the block where code execution starts.
Since there is an error raised in the begin block, the rescue
block is called.
Since an exception was raised, the else
block is skipped. The ensure
block is always executed regardless of whether an exception was raised or not. It prints "ensure
" to the console.
Cleanup task
Definition
The
ensure
keyword can also be used as a cleanup or finalization task.
It can be seen as a cleanup task because it performs an action that needs to be done regardless of whether an exception occurred or not.
It can also be considered a finalization task because it ensures that certain actions are always performed before the method exits, regardless of whether an exception was raised or not.
Example
In this example, the finalization task is printing "Operation completed.", which indicates the completion of the method's execution.
def perform_operation(dividend, divisor)
result = dividend / divisor
ensure
puts 'Operation completed'
end
puts perform_operation(10, 2)
puts perform_operation(10, 0)
In this case, it's providing feedback or logging information that indicates the completion of an operation.
Conclusion
In conclusion, the ensure
keyword in Ruby serves a crucial role in exception handling, ensuring that certain code blocks are always executed, regardless of whether an exception is raised or not.
It provides a mechanism for cleanup or finalization tasks, guaranteeing that essential actions such as releasing resources or providing feedback are carried out consistently.
Whether managing basic execution flow or handling exceptions, the ensure block adds robustness to Ruby programs by enforcing necessary actions, ultimately contributing to more reliable and maintainable code.
Its versatility makes it a fundamental feature in handling exceptions and ensuring code integrity in Ruby applications.
Done
Celebrate
Reach me out
Final thoughts
Thank you for reading this article.
If you have any questions, thoughts, suggestions, or corrections, please share them with us.
We appreciate your feedback and look forward to hearing from you.
Feel free to suggest topics for future blog articles. Until next time!