Module 12: Practice Problems
15 problems to practice error handling and debugging
Problem 1 Easy
What type of error would this code produce? print("Hello" + 5)
Think about what happens when you try to combine different data types.
TypeError - you cannot concatenate a string and an integer. Fix: print("Hello" + str(5)) or print(f"Hello{5}")
Problem 2 Easy
Write a try/except block that catches a ValueError when converting user input to an integer.
Put int(input(...)) in the try block and catch ValueError.
try: num = int(input("Enter a number: ")) print(f"You entered {num}") except ValueError: print("That's not a valid number!")
Problem 3 Easy
What type of error would my_list = [1, 2, 3]; print(my_list[5]) produce?
The list only has indices 0, 1, and 2.
IndexError: list index out of range - the list has 3 items (indices 0-2) but you tried to access index 5.
Problem 4 Easy
Write a try/except block that handles a ZeroDivisionError when dividing two numbers.
Put the division in the try block and catch ZeroDivisionError.
a = 10 b = 0 try: result = a / b print(f"Result: {result}") except ZeroDivisionError: print("Cannot divide by zero!")
Problem 5 Easy
What type of error would pritn("hello") produce?
Look carefully at the function name.
NameError: name 'pritn' is not defined - it is a typo of print.
Problem 6 Medium
Write a try/except/else block. Try to open a file for reading. If FileNotFoundError occurs, print an error. If successful, print the content.
The else block runs only when no error occurs in the try block.
try: file = open("data.txt", "r") except FileNotFoundError: print("File not found!") else: content = file.read() print(content) file.close()
Problem 7 Medium
Write a function safe_divide(a, b) that returns the result of a/b, but returns None if b is zero (using try/except).
Catch ZeroDivisionError and return None in the except block.
def safe_divide(a, b): try: return a / b except ZeroDivisionError: print("Cannot divide by zero!") return None print(safe_divide(10, 3)) # 3.333... print(safe_divide(10, 0)) # None
Problem 8 Medium
Write a function that validates an email address. It should raise a ValueError if the email does not contain "@".
Use if "@" not in email: and then raise ValueError(...).
def validate_email(email): if "@" not in email: raise ValueError(f"Invalid email: {email} (missing @)") return True try: validate_email("user@example.com") # OK validate_email("invalid-email") # Raises error except ValueError as e: print(e)
Problem 9 Medium
Write code that catches multiple exception types. Ask for two numbers and divide them. Handle both ValueError (non-numeric input) and ZeroDivisionError.
Use multiple except blocks, one for each error type.
try: a = float(input("Enter first number: ")) b = float(input("Enter second number: ")) result = a / b print(f"Result: {result}") except ValueError: print("Please enter valid numbers!") except ZeroDivisionError: print("Cannot divide by zero!")
Problem 10 Medium
Add print debugging to this buggy function. The function should return the sum of even numbers in a list, but it returns the wrong value.
def sum_evens(numbers): total = 0 for n in numbers: if n % 2 == 0: total = n # Bug here return total
Add print statements to see what total is after each iteration.
def sum_evens(numbers): total = 0 for n in numbers: if n % 2 == 0: print(f"DEBUG: n={n}, total before={total}") total += n # Fix: += instead of = print(f"DEBUG: total after={total}") return total # The bug was using = instead of += print(sum_evens([1, 2, 3, 4, 6])) # Should be 12
Problem 11 Medium
Write a try/except/finally block that opens a file, reads it, and ensures the file is always closed in the finally block.
Declare file = None before the try block so it exists in the finally block even if open fails.
file = None try: file = open("data.txt", "r") content = file.read() print(content) except FileNotFoundError: print("File not found!") finally: if file is not None: file.close() print("File closed.")
Problem 12 Hard
Write a function get_integer(prompt) that keeps asking the user for input until they enter a valid integer. Use a while loop with try/except.
Use while True and return to exit the loop when valid input is received.
def get_integer(prompt): while True: try: return int(input(prompt)) except ValueError: print("Please enter a valid integer.") age = get_integer("Enter your age: ") print(f"Your age is {age}")
Problem 13 Hard
Write a function that safely accesses a dictionary key. If the key does not exist, catch the KeyError and return a default value.
Use try/except KeyError, or compare with the built-in .get() method.
def safe_get(dictionary, key, default=None): try: return dictionary[key] except KeyError: return default person = {"name": "Alice", "age": 30} print(safe_get(person, "name")) # Alice print(safe_get(person, "email", "N/A")) # N/A
Problem 14 Hard
Write a function process_scores(filename) that reads scores from a file, handles FileNotFoundError and ValueError, and returns the average score.
Use nested try/except - one for file operations, another for converting each line to a number.
def process_scores(filename): try: with open(filename, "r") as file: scores = [] for line in file: try: score = float(line.strip()) scores.append(score) except ValueError: print(f"Skipping invalid: {line.strip()}") if scores: return sum(scores) / len(scores) return 0 except FileNotFoundError: print(f"File '{filename}' not found!") return None
Problem 15 Hard
Find and fix all the bugs in this code. There are at least 4 errors.
def calculate_stats(numbers) if len(numbers) = 0: return None total = 0 for num in numbers: total += num average = total / len(numbers) return "Average: " + average print(calculate_stats([10, 20, 30]))
Look for: missing colon, wrong comparison operator, type mismatch in concatenation, and a possible indentation issue.
Bugs found:
- Missing
:after function definition =should be==in the if condition- Cannot concatenate string and float - need
str(average)or f-string
def calculate_stats(numbers): # Fix 1: added : if len(numbers) == 0: # Fix 2: = → == return None total = 0 for num in numbers: total += num average = total / len(numbers) return f"Average: {average}" # Fix 3: use f-string print(calculate_stats([10, 20, 30])) # Average: 20.0