What is Error Handling in Python?
Error handling in Python ensures that your program continues running smoothly even when unexpected errors occur. Using tools like try, except, and finally, you can catch and handle errors gracefully, preventing crashes.
Common Types of Errors in Python
| Error Type | Description | Example |
|---|---|---|
| SyntaxError | Raised when there’s a syntax error in the code | if True print("Hello") |
| TypeError | Raised when an operation is performed on an invalid type | "1" + 1 |
| ValueError | Raised when a function receives an argument of the correct type but an invalid value | int("abc") |
| IndexError | Raised when accessing an invalid index in a list | [1, 2, 3][3] |
| KeyError | Raised when accessing a non-existent dictionary key | {"name": "Alice"}["age"] |
| ZeroDivisionError | Raised when dividing by zero | 10 / 0 |
Basic Error Handling: try-except Block
The try block lets you test code for errors, and the except block handles the error if it occurs.
Syntax:
try:
# Code that may cause an exception
except <ExceptionType>:
# Code to handle the exception
Example: Handling Division by Zero
try:
result = 10 / 0
except ZeroDivisionError:
print("Error: Division by zero is not allowed.")
Catching Multiple Exceptions
You can handle different types of exceptions using multiple except blocks.
Example:
try:
value = int(input("Enter a number: "))
result = 10 / value
except ValueError:
print("Invalid input! Please enter a valid number.")
except ZeroDivisionError:
print("Error: Cannot divide by zero.")
Using the else Block in Python
The else block executes if no exceptions are raised in the try block.
Example:
try:
result = 10 / 2
except ZeroDivisionError:
print("Division by zero is not allowed.")
else:
print(f"The result is {result}.")
The finally Block in Python
The finally block always executes, regardless of whether an exception was raised.
Example:
try:
file = open("example.txt", "r")
content = file.read()
except FileNotFoundError:
print("File not found!")
finally:
print("Cleaning up resources...")
file.close()
Raising Exceptions
Use the raise statement to trigger an exception manually.
Example:
def validate_age(age):
if age < 0:
raise ValueError("Age cannot be negative.")
print(f"Age is {age}.")
try:
validate_age(-1)
except ValueError as e:
print(e)
Custom Exceptions in Python
Create your own exceptions by subclassing the Exception class.
Example:
class CustomError(Exception):
pass
try:
raise CustomError("This is a custom error!")
except CustomError as e:
print(e)
Best Practices for Error Handling in Python
Be Specific with Exceptions:
- Avoid using a generic
exceptunless necessary.
try:
result = 10 / 0
except ZeroDivisionError:
print("Cannot divide by zero.")
Use
finallyfor Cleanup:- Ensure resources like files or network connections are closed properly.
Log Errors:
- Use logging instead of
printfor tracking issues.
- Use logging instead of
import logging
logging.basicConfig(level=logging.ERROR)
try:
result = 10 / 0
except ZeroDivisionError as e:
logging.error("Error occurred: %s", e)
Avoid Silent Failures:
- Always log or notify users when an error occurs.
Use Assertions for Debugging:
- Validate assumptions in the code using
assert.
- Validate assumptions in the code using
assert 2 + 2 == 4, "Math error!"
Common Use Cases for Error Handling
1. File Handling with Errors
try:
with open("example.txt", "r") as file:
content = file.read()
except FileNotFoundError:
print("File not found!")
2. Handling User Input
try:
number = int(input("Enter a number: "))
except ValueError:
print("Please enter a valid number.")
Practice Exercises
1. Temperature Conversion Program
Write a program to convert temperature from Celsius to Fahrenheit, handling invalid inputs.
try:
celsius = float(input("Enter temperature in Celsius: "))
fahrenheit = (celsius * 9/5) + 32
print(f"Temperature in Fahrenheit: {fahrenheit}")
except ValueError:
print("Invalid input! Please enter a numeric value.")