Finally Block in Exception Handling in Python
Finally Block in Exception Handling in Python
The finally block in Python exception handling executes regardless of whether an exception occurred or not. It’s always executed, making it perfect for cleanup operations like closing files, database connections, or releasing resources.
Basic Syntax:
python
try:
# Code that might raise an exception
except SomeException:
# Handle the exception
else:
# Code that runs only if no exception occurred
finally:
# Code that always runs (cleanup operations)
5 Basic Examples:
Example 1: File Operations with Cleanup
python
try:
file = open("data.txt", "r")
content = file.read()
print("File content:", content)
except FileNotFoundError:
print("Error: File not found!")
finally:
print("Closing file (if it was opened)")
if 'file' in locals() and not file.closed:
file.close()
# Output: Always prints the closing message
Example 2: Database Connection Cleanup
python
try:
# Simulate database connection
db_connection = "Connected to database"
print(db_connection)
# Simulate an error
raise ConnectionError("Database timeout")
except ConnectionError as e:
print(f"Database error: {e}")
finally:
print("Closing database connection")
# Cleanup code here
# Output: Always closes the connection
Example 3: Division with Resource Cleanup
python
def divide_numbers(a, b):
try:
result = a / b
print(f"Result: {result}")
return result
except ZeroDivisionError:
print("Error: Cannot divide by zero!")
return None
finally:
print("Calculation completed - cleaning up resources")
# Test cases
divide_numbers(10, 2) # Success case
divide_numbers(10, 0) # Error case
Example 4: Multiple Exception Types with Finally
python
try:
num = int(input("Enter a number: "))
reciprocal = 1 / num
except ValueError:
print("Error: Please enter a valid number!")
except ZeroDivisionError:
print("Error: Cannot divide by zero!")
else:
print(f"Reciprocal: {reciprocal}")
finally:
print("Thank you for using the calculator!")
# Always says thank you regardless of input
Example 5: Network Request Simulation
python
import time
def make_network_request():
try:
print("Making network request...")
time.sleep(1) # Simulate network delay
# Simulate random success/failure
import random
if random.choice([True, False]):
raise ConnectionError("Network timeout")
print("Request successful!")
except ConnectionError as e:
print(f"Network error: {e}")
finally:
print("Releasing network resources")
print("Closing sockets and connections")
# Test multiple times
for i in range(3):
make_network_request()
print("-" * 30)
Key Characteristics of finally:
- Always executes regardless of exceptions
- Runs after try, except, and else blocks
- Perfect for cleanup operations and resource management
- Executes even if:
- There’s a
returnstatement in try or except blocks - There’s a
breakorcontinuein loops - An unhandled exception occurs
- There’s a
Example showing finally with return:
python
def test_finally_with_return():
try:
print("In try block")
return "Return from try"
except:
print("In except block")
finally:
print("In finally block - always executes")
result = test_finally_with_return()
print(f"Function returned: {result}")
# Output:
# In try block
# In finally block - always executes
# Function returned: Return from try
When to use finally:
- Closing files and database connections
- Releasing network resources
- Cleaning up temporary files
- Resetting hardware states
- Any operation that must happen regardless of success/failure
The finally block ensures your code maintains proper resource management and cleanup, making your programs more robust and reliable.