Exception Handling Python Exercises

8 min read Oct 10, 2024
Exception Handling Python Exercises

Mastering Exception Handling in Python: A Hands-On Guide with Exercises

Exception handling is a crucial aspect of robust Python programming. It allows you to gracefully manage unexpected situations and prevent your program from crashing. This guide will walk you through the fundamentals of exception handling in Python with practical exercises to solidify your understanding.

Understanding Exceptions

Exceptions are errors that occur during the execution of your Python code. They can arise from various sources like invalid input, file operations, network connectivity issues, and more. Python's exception handling mechanism provides a structured way to catch these errors and handle them appropriately.

The try...except Block

The core of exception handling in Python lies in the try...except block. Here's how it works:

  1. try Block: This block contains the code that might potentially raise an exception.
  2. except Block: This block is executed only if an exception occurs within the try block. You can specify the type of exception you want to catch within the except clause.

Let's illustrate with a simple example:

try:
    # This code might raise a ZeroDivisionError
    result = 10 / 0
except ZeroDivisionError:
    print("You can't divide by zero!")

In this code, the division by zero within the try block will trigger a ZeroDivisionError. Since we've specified ZeroDivisionError in the except clause, the error message will be printed.

Multiple except Clauses

You can have multiple except clauses to handle different types of exceptions:

try:
    # Code that might raise an exception
    file = open("nonexistent.txt", "r")
    data = file.read()
except FileNotFoundError:
    print("File not found!")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

This example demonstrates catching both FileNotFoundError and any other generic exception.

The else Clause

The else clause can be added to the try...except block. It will be executed if no exception occurs in the try block:

try:
    # Code that might raise an exception
    number = int(input("Enter a number: "))
    result = number * 2
except ValueError:
    print("Invalid input. Please enter a number.")
else:
    print(f"The result is: {result}")

The finally Clause

The finally clause is executed regardless of whether an exception occurs or not. This is useful for cleaning up resources or ensuring specific actions happen:

try:
    # Code that might raise an exception
    file = open("data.txt", "r")
    data = file.read()
    print(data)
except FileNotFoundError:
    print("File not found!")
finally:
    file.close()

Here, the file will be closed in the finally clause, even if an exception is raised.

Exception Handling Exercises

Now let's put your knowledge to the test with some practical exercises:

Exercise 1: Handling Invalid Input

Write a program that takes a number from the user and calculates its square root. Handle the ValueError exception if the user inputs a non-numeric value.

Exercise 2: File Handling with Exceptions

Create a program that reads data from a file named "data.txt". Handle the FileNotFoundError if the file doesn't exist. If the file exists, print its contents.

Exercise 3: Network Error Handling

Write a script that attempts to connect to a website (e.g., "www.google.com"). Handle the ConnectionError if the connection fails.

Exercise 4: Custom Exceptions

Define a custom exception called InvalidAgeError to raise if the user enters an age less than 0. Create a program that takes age as input and raises the InvalidAgeError if the age is invalid.

Exercise 5: User-Defined Function with Exception Handling

Create a function that calculates the factorial of a number. Handle the ValueError exception if the input is negative.

Solutions

Exercise 1:

try:
    number = float(input("Enter a number: "))
    square_root = number ** 0.5
    print(f"The square root of {number} is {square_root}")
except ValueError:
    print("Invalid input. Please enter a number.")

Exercise 2:

try:
    with open("data.txt", "r") as file:
        data = file.read()
        print(data)
except FileNotFoundError:
    print("File not found!")

Exercise 3:

import requests

try:
    response = requests.get("https://www.google.com")
    print("Connection successful!")
except ConnectionError:
    print("Connection failed!")

Exercise 4:

class InvalidAgeError(Exception):
    pass

try:
    age = int(input("Enter your age: "))
    if age < 0:
        raise InvalidAgeError("Age cannot be negative.")
    print("Valid age.")
except InvalidAgeError as e:
    print(e)

Exercise 5:

def factorial(n):
    if n < 0:
        raise ValueError("Factorial is not defined for negative numbers.")
    elif n == 0:
        return 1
    else:
        return n * factorial(n - 1)

try:
    number = int(input("Enter a number: "))
    result = factorial(number)
    print(f"The factorial of {number} is {result}")
except ValueError as e:
    print(e)

Conclusion

Exception handling is an essential aspect of writing robust and reliable Python code. By effectively handling exceptions, you can prevent your program from crashing and provide informative error messages to the user. The exercises in this guide have helped you gain practical experience in implementing exception handling techniques. Remember to always anticipate potential exceptions and handle them gracefully to create robust and user-friendly Python programs.