Skip to main content

Exception Handling

In the previous lesson, we delved into the basics of exception handling in Python, primarily utilizing the try and except blocks. However, Python provides additional constructs to enhance error handling capabilities: else and finally blocks. In this tutorial, we'll explore these blocks in detail with practical examples.

The else Block

The else block in Python's exception handling mechanism acts as a success listener. It executes only if the code within the try block completes successfully without raising any exceptions. It provides a way to distinguish between the normal execution flow and the exceptional cases.

Syntax:

try:
# Code that may raise an exception
except ExceptionType:
# Exception handling code
else:
# Code to execute if no exceptions occur

Let's understand its usage with an example:

user_input = "10"  # Hard-coded user input

try:
result = 1 / float(user_input) # Attempting a potentially risky operation
print("1 divided by user input is:", result)
except ValueError:
print("You cannot use user input as a value.")
else:
print("Success! No exceptions encountered.")

In this example:

  • If user_input is a non-numeric value like "ABC", the except block will handle the ValueError.
  • If user_input is "0", a ZeroDivisionError will be caught by the except block.
  • If user_input is a valid numeric value like "10", the division operation will succeed, and the else block will execute.

The finally Block

The finally block ensures that certain code executes, regardless of whether an exception occurs or not. It's typically used for cleanup operations like closing files or releasing resources, ensuring that essential tasks are performed before the program exits.

Syntax:

try:
# Code that may raise an exception
except ExceptionType:
# Exception handling code
finally:
# Code that always executes, regardless of exceptions

Let's see how it works in practice:

user_input = "10"  # Hard-coded user input

try:
result = 1 / float(user_input) # Attempting a potentially risky operation
print("1 divided by user input is:", result)
except ValueError:
print("You cannot use user input as a value.")
else:
print("Success! No exceptions encountered.")
finally:
print("Finally block always executes.")

Here:

  • Whether the operation succeeds or fails, the finally block ensures execution.
  • Even if an exception is raised and caught, the finally block runs, providing a way to guarantee essential operations are performed before exiting the program.

Conclusion

In Python, utilizing else and finally blocks provides additional control and robustness to your exception handling strategy. While else offers a way to distinguish between successful and exceptional executions, finally ensures that critical cleanup tasks are performed, regardless of the program's flow. Remember, while these constructs are powerful, it's crucial to use them judiciously and maintain code readability for better maintainability and understanding.