Search⌘ K
AI Features

Catching and Raising Exceptions

Explore how to manage errors in Python by catching exceptions with try and except blocks, accessing exception details, and using else and finally for flow control and cleanup. Understand raising exceptions manually to enforce business rules and improve program stability and user experience.

The previous lesson introduced how to read tracebacks and explained how unhandled exceptions terminate program execution. Although tracebacks are useful for debugging, abrupt program termination is undesirable for users. Reliable programs require mechanisms to detect errors, respond appropriately, and either continue execution or terminate safely.

In this lesson, we will take control of error handling. Rather than allowing Python to halt our programs automatically, we will intercept exceptions and explicitly define how our code should respond and recover.

The basic try and except block

The foundation of error handling in Python is the try and except block. Code that may fail because of user input, external data, or unpredictable conditions is placed inside the try block. If an exception occurs, Python stops executing the remaining statements in the try block and transfers control to the corresponding except block.

If no exception is raised, the except block is skipped entirely. This structure allows us to define a fallback response to errors without causing the entire program to crash. Look at the code below:

Python
def safe_divide(a, b):
try:
result = a / b
print(f"Result: {result}")
except ZeroDivisionError:
print("Error: Cannot divide by zero.")
# Test with a valid division
safe_divide(10, 2)
# Test with an invalid division
safe_divide(5, 0)
print("Program continues...")
  • Lines 2–4: The try block defines a safe zone for risky code. When the division at line 3 encounters a zero denominator, Python stops executing the try block immediately, skipping the print statement at line 4, and looks for an exception handler.

  • Line 5: The except ZeroDivisionError: ...