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 return statement in try or except blocks
    • There’s a break or continue in loops
    • An unhandled exception occurs

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.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *