Python Exception Handling Masterclass
Chapter 1: Introduction to Python Exception Handling
Build Reliable Python, AI, Cloud, and DevOps Applications
Target Audience: Beginners to Intermediate Developers
Prerequisites:
Basic Python syntax
Variables
Functions
Loops
File handling (optional)
Table of Contents
Introduction
What is an Exception?
Why Do Programs Fail?
Errors vs Exceptions
Types of Errors
Why Exception Handling Matters
Real-world Examples
AI Perspective
Cloud Perspective
DevOps Perspective
Full Stack Perspective
Career Opportunities
Summary
Quiz
Exercises
Introduction
Python has become one of the most popular programming languages because it powers many of today's technologies, including:
Artificial Intelligence (AI)
Generative AI
Machine Learning
Data Science
Web Development
Cloud Computing
DevOps Automation
Cybersecurity
Internet of Things (IoT)
Whether you are building an AI chatbot, automating cloud infrastructure, or developing a web application, one reality remains the same:
Things can go wrong.
A file may not exist, a user might enter invalid data, a database connection could fail, or an AI service might be unavailable. If your program cannot handle these situations, it may crash and provide a poor user experience.
Exception handling helps your applications recover from such situations gracefully, making them more reliable and maintainable.
Learning Objectives
By the end of this chapter, you will be able to:
Explain what an exception is.
Distinguish between errors and exceptions.
Understand why programs fail.
Explain the importance of exception handling.
Recognize common exceptions in Python.
Understand why exception handling is essential in AI, Cloud, DevOps, and Full Stack development.
What is an Exception?
An exception is an event that interrupts the normal execution of a Python program.
When an exception occurs, Python raises an error. If the program does not handle it, execution stops immediately.
Example
print("Program Started")
number = 10
result = number / 0
print("Program Completed")
Output
Program Started
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
The program stops before reaching the final print() statement because dividing by zero is not allowed.
Why Do Programs Fail?
Programs interact with many external systems, and failures are common.
User Input
age = int(input("Enter your age: "))
If the user enters:
Twenty Five
Python raises a ValueError.
Missing File
file = open("students.csv")
If the file doesn't exist:
FileNotFoundError
Database Failure
connection.connect()
Possible issues:
Database server offline
Wrong password
Network failure
API Failure
response = requests.get(api_url)
Potential problems:
Timeout
Authentication failure
Server unavailable
Invalid endpoint
Errors vs Exceptions
Many beginners use these terms interchangeably, but they have different meanings.
Errors
Errors are typically caused by incorrect code and prevent the program from running correctly.
Example:
print("Hello"
Output:
SyntaxError: '(' was never closed
This error must be fixed before the program can run.
Exceptions
Exceptions occur while the program is running due to unexpected situations.
Example:
number = int(input("Enter a number: "))
If the user enters:
abc
Output:
ValueError
The code is syntactically correct, but the input causes an exception.
Types of Errors in Python
1. Syntax Errors
if True
print("Hello")
Output:
SyntaxError
2. Runtime Errors (Exceptions)
10 / 0
Output:
ZeroDivisionError
3. Logical Errors
radius = 5
area = 2 * 3.14 * radius
The program runs successfully, but the formula calculates the circumference instead of the area.
Logical errors do not produce exceptions but result in incorrect output.
Why Exception Handling Matters
Imagine an online shopping application.
Customer
│
▼
Payment
│
▼
Database
│
▼
Email
If the email service fails after the payment is completed, should the application crash?
No.
A professional application:
Processes the payment.
Logs the email failure.
Retries sending the email later.
Displays a success message to the customer.
This is achieved through proper exception handling.
Real-world Examples
Banking
If the SMS service is unavailable, the money transfer should still succeed.
Hospital
If printing a receipt fails, the patient's medical record should still be saved.
E-commerce
If the recommendation engine is unavailable, the customer should still be able to purchase products.
Airline Booking
If the seat map cannot be displayed, users should still be able to book flights.
Exception Handling in Artificial Intelligence
Modern AI systems are built by integrating multiple components:
User
│
▼
Prompt
│
▼
AI Model
│
▼
Vector Database
│
▼
Response
Failures can occur at every stage.
Examples:
Invalid prompt
AI API timeout
Authentication failure
Rate limiting
Network issues
Missing model
Corrupted embeddings
Without exception handling, the AI application may crash or expose technical errors to users.
With exception handling, the application can:
Retry failed requests.
Return user-friendly messages.
Log errors for developers.
Use fallback models when necessary.
Exception Handling in Cloud Computing
Cloud applications rely on external services.
Examples include:
AWS S3
Azure Blob Storage
Google Cloud Storage
Cloud SQL
Key Vault
IAM services
Common failures:
Access denied
Invalid credentials
Missing resources
Network latency
API throttling
Exception handling allows applications to recover gracefully and maintain reliability.
Exception Handling in DevOps
DevOps engineers frequently automate tasks such as:
Creating virtual machines
Deploying Kubernetes clusters
Running CI/CD pipelines
Configuring servers
Managing containers
Example:
Git Push
│
▼
CI/CD Pipeline
│
▼
Docker Build
│
▼
Kubernetes Deployment
If one step fails, exception handling helps:
Stop the deployment safely.
Roll back changes.
Notify the team.
Preserve logs for troubleshooting.
Exception Handling in Full Stack Development
Full Stack applications often involve:
User interfaces
REST APIs
Databases
Authentication
File uploads
Third-party integrations
Typical failures include:
Invalid form data
Authentication errors
Missing files
Database connection failures
Payment gateway issues
Exception handling ensures users receive meaningful messages while protecting application stability.
Why Companies Value Exception Handling
Professional developers are expected to write resilient software.
Recruiters look for engineers who can:
Handle failures gracefully.
Build reliable APIs.
Protect sensitive information.
Write maintainable code.
Improve user experience.
Support scalable cloud-native applications.
These skills are highly valued in roles such as:
Python Developer
AI Engineer
Machine Learning Engineer
Data Engineer
Cloud Engineer
DevOps Engineer
Site Reliability Engineer (SRE)
Backend Developer
Full Stack Developer
Chapter Summary
In this chapter, you learned:
What exceptions are.
The difference between errors and exceptions.
Why programs fail.
The importance of exception handling.
How exception handling improves reliability.
Its relevance across AI, Cloud, DevOps, and Full Stack Development.
In the next chapter, we'll explore the core building blocks of exception handling:
tryexceptelsefinally
with practical examples, interview questions, and real-world scenarios.
Chapter Quiz
What is an exception in Python?
What is the difference between an error and an exception?
Name three situations where exceptions commonly occur.
Why is exception handling important in AI applications?
How does exception handling improve cloud-native applications?
What type of error occurs when dividing by zero?
What happens if an exception is not handled?
Give an example of a logical error.
Why do DevOps engineers use exception handling in automation scripts?
How does exception handling improve the user experience?
Hands-on Exercise
Write a Python program that:
Displays
"Program Started".Asks the user to enter two numbers.
Divides the first number by the second.
Displays the result.
Observe what happens if the second number is
0or if the input is not numeric.
In the next chapter, you'll learn how to prevent these crashes using try, except, else, and finally.
Python Exception Handling Masterclass
Chapter 2: Mastering try, except, else, and finally
Learning Objectives
By the end of this chapter, you will be able to:
-
Understand the purpose of
try,except,else, andfinally. - Handle common exceptions gracefully.
- Write production-ready error handling code.
- Apply exception handling to AI, Cloud, DevOps, and Full Stack applications.
- Avoid common beginner mistakes.
- Follow Python best practices.
Why Do We Need try and except?
In the previous chapter, we learned that a program crashes when an exception is not handled.
Consider the following example:
num1 = 10 num2 = 0 print(num1 / num2) print("Program Completed")
Output
ZeroDivisionError: division by zero
The final line is never executed because Python stops the program when it encounters an unhandled exception.
What is a try Block?
A try block contains code that might raise an exception.
Python first executes the code inside the try block.
If no exception occurs, Python skips the except block.
Syntax
try: # Risky code except: # Handle error
Example 1: Division by Zero
try: result = 10 / 0 print(result) except ZeroDivisionError: print("You cannot divide by zero.") print("Program Continues...")
Output
You cannot divide by zero. Program Continues...
Notice that the program does not crash.
Execution Flow
Start │ ▼ Execute try │ ┌───┴────┐ │ │ No Exception Exception │ │ ▼ ▼ Skip except Execute except │ │ └───┬────┘ ▼ Continue
Example 2: Valid Input
try: age = int(input("Enter Age : ")) print(age) except ValueError: print("Please enter numbers only.")
Input
25
Output
25
Input
Twenty Five
Output
Please enter numbers only.
Multiple Exceptions
One program can produce different types of exceptions.
try: number = int(input("Enter Number : ")) print(100 / number) except ValueError: print("Invalid Input") except ZeroDivisionError: print("Cannot divide by zero")
Test Case 1
Input
abc
Output
Invalid Input
Test Case 2
Input
0
Output
Cannot divide by zero
Test Case 3
Input
5
Output
20.0
Catching Multiple Exceptions Together
try: number = int(input()) print(100 / number) except (ValueError, ZeroDivisionError): print("Invalid Operation")
This approach is useful when different exceptions require the same handling.
Using Exception as e
Professional developers usually write:
try: number = int(input()) print(100 / number) except Exception as e: print(e)
Output
division by zero
or
invalid literal for int()
This helps developers understand the exact error.
Should We Always Use Exception?
No.
Bad Practice
except Exception: print("Error")
Better Practice
except FileNotFoundError: ... except ZeroDivisionError: ... except ValueError: ...
Specific exceptions make debugging easier.
The else Block
Many beginners never use else, but it makes code cleaner.
The else block executes only if no exception occurs.
try: number = int(input()) except ValueError: print("Invalid Number") else: print("Square =", number ** 2)
Input
5
Output
Square = 25
Input
abc
Output
Invalid Number
Notice that else does not execute when an exception occurs.
Why Use else?
Without else
try: number = int(input()) print(number ** 2) except ValueError: print("Invalid")
With else
try: number = int(input()) except ValueError: print("Invalid") else: print(number ** 2)
The second version separates normal logic from error handling, improving readability.
The finally Block
The finally block executes whether an exception occurs or not.
It is mainly used to release resources.
Syntax
try: ... except: ... finally: ...
Example
try: print("Inside Try") except: print("Inside Except") finally: print("Inside Finally")
Output
Inside Try Inside Finally
Example with Exception
try: print(10 / 0) except ZeroDivisionError: print("Division Error") finally: print("Finally Executed")
Output
Division Error Finally Executed
Why Finally Exists
Imagine opening a file.
file = open("students.txt")
If an exception occurs, the file remains open.
Professional code:
file = None try: file = open("students.txt") print(file.read()) except FileNotFoundError: print("Missing File") finally: if file: file.close() print("File Closed")
Real AI Example
Suppose you're calling an AI model.
try: response = llm.generate(prompt) except Exception: print("AI service unavailable") finally: print("Request Completed")
Even if the AI service is unavailable, the application can still log the request or release resources.
Cloud Example
try: s3.upload_file(...) except Exception: print("Upload Failed") finally: print("Closing Connection")
DevOps Example
try: deploy_application() except Exception: rollback() finally: notify_team()
This ensures that the deployment team is notified regardless of success or failure.
Full Stack Example
try: save_user() except Exception: show_error() finally: close_database_connection()
Does finally Always Execute?
Yes.
Even with:
-
return -
break -
continue -
raise -
sys.exit()
Python executes the finally block before leaving the try statement.
Example
def demo(): try: print("Inside Try") return finally: print("Finally Executed") demo()
Output
Inside Try Finally Executed
When finally Does Not Execute
Only in rare situations, such as:
- Python interpreter crash
- Power failure
-
Operating system forcefully terminates the process (e.g.,
kill -9on Linux) - Fatal native extension crash
Under normal execution, finally always runs.
Common Beginner Mistakes
Catching Every Exception
except: pass
This hides errors and makes debugging difficult.
Ignoring Error Details
except Exception: print("Error")
Prefer:
except Exception as e: print(e)
Forgetting to Close Resources
Always clean up resources like files, database connections, and network sockets using finally or context managers (with statement).
Best Practices
- Catch specific exceptions whenever possible.
-
Use
elsefor code that should run only when no exception occurs. -
Use
finallyfor cleanup. - Log exceptions in production applications.
-
Avoid empty
exceptblocks. -
Keep
tryblocks focused on the code that may raise an exception.
Interview Questions
-
What is the purpose of a
tryblock? -
When does an
exceptblock execute? -
What is the difference between
except Exceptionandexcept ValueError? -
When is the
elseblock executed? -
Why is
finallyimportant? -
Can
finallybe skipped? -
Does
returnpreventfinallyfrom executing? -
What are some common resources that should be released in
finally? -
Why should you avoid
except: pass? - How is exception handling used in AI and DevOps applications?
Hands-on Exercise
Write a program that:
- Prompts the user to enter the name of a text file.
- Attempts to open and display the file contents.
- If the file does not exist, prints a user-friendly message.
-
Uses an
elseblock to display"File read successfully."only when the file is opened without errors. -
Uses a
finallyblock to print"Operation completed."regardless of whether the file was opened successfully.
Up Next: Chapter 3 – Exception Hierarchy & Built-in Exceptions
You'll learn:
- Why Python organizes exceptions into a hierarchy.
-
The difference between
BaseExceptionandException. -
Common built-in exceptions such as
ValueError,TypeError,KeyError,IndexError,FileNotFoundError, and more. - How understanding the hierarchy helps you write cleaner, more maintainable, and production-ready code.
Python Exception Handling Masterclass
Chapter 3: Understanding Python Exception Hierarchy
Learning Objectives
By the end of this chapter, you will be able to:
- Understand Python's exception hierarchy.
-
Differentiate between
BaseExceptionandException. - Catch specific exceptions effectively.
- Use parent and child exceptions correctly.
- Apply exception hierarchy in AI, Cloud, DevOps, and Full Stack applications.
- Write cleaner and more maintainable exception handling code.
What is an Exception Hierarchy?
Python organizes exceptions in a tree-like hierarchy.
Instead of creating thousands of unrelated exceptions, Python groups similar exceptions under parent classes.
Think of it like a family tree.
Living Things │ Animal │ Mammal │ Dog
Every Dog is a Mammal.
Every Mammal is an Animal.
Similarly,
Exception │ ValueError
Every ValueError is also an Exception.
This allows us to catch either:
-
the specific error (
ValueError) -
or the parent (
Exception).
Why Does Python Use Exception Hierarchy?
Suppose Python had 500 unrelated exceptions.
You would need:
except Error1: except Error2: except Error3: except Error4: except Error5:
Instead, Python groups them.
except Exception:
One line can catch hundreds of exception types.
This makes code cleaner and easier to maintain.
Complete Exception Hierarchy
BaseException │ ├── SystemExit ├── KeyboardInterrupt ├── GeneratorExit │ └── Exception │ ├── ArithmeticError │ ├── FloatingPointError │ ├── OverflowError │ └── ZeroDivisionError │ ├── AssertionError │ ├── AttributeError │ ├── EOFError │ ├── ImportError │ └── ModuleNotFoundError │ ├── LookupError │ ├── IndexError │ └── KeyError │ ├── MemoryError │ ├── NameError │ ├── OSError │ ├── FileExistsError │ ├── FileNotFoundError │ ├── PermissionError │ └── TimeoutError │ ├── RuntimeError │ ├── StopIteration │ ├── SyntaxError │ ├── TypeError │ ├── ValueError │ └── Warning
BaseException
This is the root of all exceptions.
Everything ultimately inherits from it.
try: print(10 / 0) except BaseException: print("Caught")
Output
Caught
But professional developers rarely use BaseException.
Why?
Because it also catches
-
Ctrl+C (
KeyboardInterrupt) -
sys.exit() - Program termination
which usually should not be intercepted.
Exception
Most application errors inherit from Exception.
Example
try: number = int("abc") except Exception as e: print(type(e))
Output
<class 'ValueError'>
This is why
except Exception
works for most runtime errors.
ArithmeticError
Parent class for mathematical exceptions.
ArithmeticError │ ├── ZeroDivisionError ├── OverflowError └── FloatingPointError
Example
try: print(10 / 0) except ArithmeticError: print("Arithmetic Problem")
Output
Arithmetic Problem
Notice that we never mentioned ZeroDivisionError.
Because it inherits from ArithmeticError.
ZeroDivisionError
try: print(100 / 0) except ZeroDivisionError: print("Division by zero")
OverflowError
Occurs when numbers exceed platform limits (less common in modern Python because integers have arbitrary precision, but may occur with certain libraries or floating-point operations).
import math try: print(math.exp(1000)) except OverflowError: print("Number too large")
ValueError
Occurs when the value is inappropriate.
try: age = int("Twenty") except ValueError: print("Invalid Number")
TypeError
Occurs when incompatible data types are used together.
try: print("10" + 10) except TypeError: print("Wrong Data Type")
NameError
Occurs when a variable does not exist.
try: print(student) except NameError: print("Variable Not Found")
IndexError
Occurs when list index exceeds range.
students = ["Amit", "John"] try: print(students[5]) except IndexError: print("Invalid Index")
KeyError
Occurs when dictionary key is missing.
student = { "name": "Amit" } try: print(student["age"]) except KeyError: print("Key Missing")
FileNotFoundError
One of the most common exceptions.
try: file = open("marks.txt") except FileNotFoundError: print("File Missing")
ModuleNotFoundError
try: import tensorflow123 except ModuleNotFoundError: print("Module Missing")
ImportError
Occurs when importing fails.
try: from math import square except ImportError: print("Cannot Import")
PermissionError
try: file = open("/root/test.txt") except PermissionError: print("Permission Denied")
TimeoutError
Often encountered in cloud services.
try: raise TimeoutError("Connection Timed Out") except TimeoutError: print("Retry Again")
AI Example
Suppose you're calling an LLM.
try: response = llm.generate(prompt) except TimeoutError: print("LLM Timeout") except ConnectionError: print("Network Failure") except Exception as e: print(e)
Professional AI applications often catch specific exceptions first and then fall back to a generic handler.
Cloud Example
AWS S3 upload.
try: upload_to_s3() except PermissionError: print("Access Denied") except TimeoutError: print("Retry Upload") except Exception: print("Unknown Cloud Error")
DevOps Example
try: deploy() except FileNotFoundError: print("YAML Missing") except PermissionError: print("Kubernetes Permission Error") except Exception: rollback()
Catching Parent vs Child Exceptions
Suppose
ArithmeticError │ ZeroDivisionError
If you write
except ArithmeticError:
Python catches
- ZeroDivisionError
- OverflowError
- FloatingPointError
because they all inherit from ArithmeticError.
Order Matters
Incorrect
try: print(10 / 0) except Exception: print("General Error") except ZeroDivisionError: print("Divide by Zero")
This produces an error because Exception catches ZeroDivisionError first, making the second except unreachable.
Correct
try: print(10 / 0) except ZeroDivisionError: print("Divide by Zero") except Exception: print("General Error")
Always place specific exceptions before general ones.
How to Discover an Exception Type
You can inspect the exception class.
try: int("abc") except Exception as e: print(type(e))
Output
<class 'ValueError'>
Best Practices
✔ Catch specific exceptions whenever possible.
✔ Place child exceptions before parent exceptions.
✔ Use Exception as a fallback.
✔ Avoid catching BaseException in application code.
✔ Log exceptions in production systems instead of silently ignoring them.
Real-World Relevance
Understanding the exception hierarchy is valuable across modern software development:
AI & Generative AI
- Handle API rate limits and timeouts.
- Validate prompts and model outputs.
- Recover from service interruptions.
Cloud
- Manage authentication failures.
- Retry transient network issues.
- Handle storage and permission errors.
DevOps
- Detect deployment failures.
- Process configuration file errors.
- Manage automation scripts safely.
Python Full Stack
- Handle invalid user input.
- Manage database connection errors.
- Return meaningful API responses.
Chapter Summary
In this chapter, you learned:
- How Python organizes exceptions in a hierarchy.
-
The roles of
BaseExceptionandException. - Common built-in exception classes.
- Why exception order matters.
- How parent and child exceptions simplify error handling.
- Practical applications in AI, Cloud, DevOps, and Full Stack development.
Interview Questions
- What is the purpose of Python's exception hierarchy?
-
What is the difference between
BaseExceptionandException? -
Why is
ZeroDivisionErrorconsidered anArithmeticError? - Why should specific exceptions be caught before general exceptions?
-
When would you use
except Exception as e? -
Why is catching
BaseExceptiongenerally discouraged? - How can you determine the type of an exception at runtime?
- Name three exceptions commonly encountered in AI or cloud applications.
-
What happens if
except Exceptionappears beforeexcept ValueError? - How does exception hierarchy improve code maintainability?
Up Next: Chapter 4 – Raising Exceptions (raise), Custom Exceptions, Assertions, and Building Production-Ready Validation
In the next chapter, you'll learn how to create your own exceptions, validate business rules, build reusable error classes, and implement robust input validation for AI applications, cloud services, and enterprise software.
Python Exception Handling Masterclass
Chapter 4: Raising Exceptions, Custom Exceptions & Assertions
Learning Objectives
By the end of this chapter, you will be able to:
-
Understand the purpose of the
raisestatement. - Raise built-in exceptions manually.
- Create and use custom exceptions.
- Use assertions for debugging.
- Apply validation in AI, Cloud, DevOps, and Full Stack applications.
- Write cleaner and more maintainable business logic.
Why Raise an Exception?
So far, we've been catching exceptions generated by Python.
Sometimes, however, your application needs to detect invalid conditions and explicitly stop processing.
For example:
- A bank account has insufficient funds.
- A student enters a negative age.
- An AI prompt is empty.
- A Kubernetes deployment file is invalid.
- An AWS S3 bucket name doesn't meet naming rules.
In these situations, your code—not Python—should raise an exception.
What is the raise Statement?
The raise statement allows you to generate an exception manually.
Syntax
raise ExceptionType("Error Message")
Example 1: Raise a ValueError
age = -5 if age < 0: raise ValueError("Age cannot be negative.") print("Age:", age)
Output
Traceback (most recent call last): ... ValueError: Age cannot be negative.
Example 2: Handle the Raised Exception
try: age = -10 if age < 0: raise ValueError("Age cannot be negative.") print(age) except ValueError as e: print(e)
Output
Age cannot be negative.
Example 3: Salary Validation
salary = -50000 if salary < 0: raise ValueError("Salary cannot be negative.")
Example 4: Password Validation
password = "abc" if len(password) < 8: raise ValueError("Password must contain at least 8 characters.")
Example 5: Email Validation
email = "johngmail.com" if "@" not in email: raise ValueError("Invalid email address.")
AI Example: Validate User Prompt
Imagine you're building an AI chatbot.
prompt = input("Enter Prompt: ") if len(prompt.strip()) == 0: raise ValueError("Prompt cannot be empty.")
Without validation, your AI model might receive invalid input and return poor or unpredictable results.
AI Example: Prompt Length Validation
Large language models often have token limits.
prompt = input("Enter Prompt: ") if len(prompt) > 5000: raise ValueError("Prompt exceeds the maximum allowed length.")
AI Example: Model Availability
model_name = "gpt-unknown" supported_models = ["gpt-4.1", "gpt-4o-mini"] if model_name not in supported_models: raise ValueError("Unsupported AI model.")
Cloud Example: Validate AWS Region
region = "india" valid_regions = [ "us-east-1", "eu-west-1", "ap-south-1" ] if region not in valid_regions: raise ValueError("Invalid AWS Region.")
DevOps Example: Validate Kubernetes YAML
deployment_name = "" if deployment_name == "": raise ValueError("Deployment name cannot be empty.")
Full Stack Example: Validate User Registration
username = "" if username.strip() == "": raise ValueError("Username is required.")
Creating Your Own Exception
Python allows you to create custom exception classes.
Syntax
class MyException(Exception): pass
Notice that the class inherits from Exception.
Example: Bank Account Exception
class InsufficientBalanceError(Exception): pass balance = 500 withdraw = 1000 if withdraw > balance: raise InsufficientBalanceError("Insufficient account balance.")
Output
Insufficient account balance.
Catching Custom Exceptions
class InvalidAgeError(Exception): pass try: age = -5 if age < 0: raise InvalidAgeError("Age must be positive.") except InvalidAgeError as e: print(e)
Output
Age must be positive.
AI Example: Custom Exception
class PromptTooLongError(Exception): pass prompt = "A" * 6000 if len(prompt) > 5000: raise PromptTooLongError("Prompt exceeds AI limit.")
Cloud Example
class InvalidBucketError(Exception): pass bucket = "" if bucket == "": raise InvalidBucketError("Bucket name cannot be empty.")
DevOps Example
class DeploymentFailed(Exception): pass deployment_status = "Failed" if deployment_status == "Failed": raise DeploymentFailed("Deployment unsuccessful.")
Adding Information to Custom Exceptions
class StudentAgeError(Exception): def __init__(self, age): self.age = age def __str__(self): return f"Invalid student age: {self.age}"
Using it:
age = -2 if age < 0: raise StudentAgeError(age)
Output
Invalid student age: -2
What is an Assertion?
Assertions are used to verify assumptions during development.
Syntax
assert condition, "message"
Example
age = 20 assert age >= 18, "Age must be at least 18." print("Eligible")
Output
Eligible
Failed Assertion
age = 12 assert age >= 18, "Age must be at least 18."
Output
AssertionError: Age must be at least 18.
When to Use assert
Good uses:
- Debugging
- Verifying assumptions
- Unit testing
- Internal consistency checks
Avoid using assert for validating user input in production because assertions can be disabled with Python optimization flags.
Instead, use explicit checks and raise appropriate exceptions.
Validation Flow
User Input │ ▼ Validation │ ├── Valid ─────────► Continue Processing │ └── Invalid │ ▼ raise Exception │ ▼ except Block │ ▼ User-Friendly Message
Best Practices
- Raise meaningful exceptions.
- Use built-in exceptions when appropriate.
- Create custom exceptions for business-specific rules.
- Provide clear, descriptive error messages.
- Separate validation logic from business logic.
-
Avoid raising generic
Exceptionunless there is no suitable alternative.
Real-World Applications
AI & Generative AI
- Validate prompts before sending them to an LLM.
- Ensure API keys are configured.
- Check model availability.
- Validate model outputs.
Cloud
- Validate cloud resource names.
- Check credentials.
- Ensure regions and services are supported.
DevOps
- Validate deployment configurations.
- Verify required files exist.
- Check environment variables before automation.
Full Stack Development
- Validate forms.
- Enforce password policies.
- Check required request fields.
- Prevent invalid data from reaching the database.
Chapter Summary
In this chapter, you learned:
-
How to use the
raisestatement. - When to raise built-in exceptions.
- How to create and use custom exception classes.
- The purpose of assertions.
- Why validation is critical in production software.
- How these techniques apply to AI, Cloud, DevOps, and Full Stack applications.
Interview Questions
-
What is the purpose of the
raisestatement? - When should you create a custom exception instead of using a built-in one?
-
Why should custom exceptions inherit from
Exception? -
What is the difference between
raise ValueErrorandraise Exception? - How are assertions different from exception handling?
- Why are assertions not recommended for validating user input in production?
- Give an example of a business rule that requires a custom exception.
- How would you validate an AI prompt before sending it to a language model?
- What information can you include in a custom exception class?
- How do meaningful error messages improve debugging and user experience?
Up Next: Chapter 5 – Logging, Tracebacks, and Production-Grade Exception Handling
You'll learn how professional engineers capture exceptions using Python's logging module, interpret stack traces, generate structured logs, and integrate error reporting with AI services, cloud platforms, and DevOps monitoring tools such as AWS CloudWatch, Azure Monitor, Grafana, and OpenTelemetry. This chapter will focus on writing production-ready applications that are easier to monitor, troubleshoot, and maintain.
Python Exception Handling Masterclass
Chapter 5: Logging, Tracebacks & Production-Grade Exception Handling
Learning Objectives
After completing this chapter, you will be able to:
-
Understand why
print()is not suitable for production applications. -
Use Python's
loggingmodule effectively. - Configure log levels and handlers.
- Capture and interpret stack traces.
- Log exceptions in AI, Cloud, DevOps, and Full Stack applications.
- Implement retry logic for transient failures.
- Follow industry best practices for observability and monitoring.
Why Logging Matters
During development, it's common to use print() statements to understand program flow.
print("Connecting to database...")
While this works for learning and debugging small programs, it is not suitable for production systems.
Imagine a web application serving thousands of users. If an error occurs at 2:00 AM, developers won't be watching the console output. They need persistent logs that record:
- When the error occurred
- Which user was affected
- What operation was being performed
- The exception details
- The stack trace
Without logs, diagnosing production issues becomes extremely difficult.
What is Logging?
Logging is the process of recording events, messages, warnings, and errors generated by an application. These records help developers monitor system health, troubleshoot issues, and audit application behavior.
Typical information stored in a log entry includes:
- Timestamp
- Log level
- Module or file name
- Message
- Exception details
- Stack trace (if available)
Why Not Use print()?
Consider the following program:
print("Program Started") result = 10 / 0 print("Program Completed")
When an exception occurs, only the first message is displayed, and no permanent record is kept.
Instead, use the logging module:
import logging logging.basicConfig(level=logging.INFO) logging.info("Program Started") try: result = 10 / 0 except ZeroDivisionError: logging.error("Division by zero occurred.") logging.info("Program Completed")
Log Levels
Python provides several log levels to indicate the severity of messages.
| Level | Purpose | Example |
|---|---|---|
| DEBUG | Detailed diagnostic information | Variable values |
| INFO | General application events | User logged in |
| WARNING | Potential problems | Disk space low |
| ERROR | Recoverable errors | File not found |
| CRITICAL | Serious failures | Database unavailable |
DEBUG
Used during development to record detailed information.
import logging logging.basicConfig(level=logging.DEBUG) number = 25 logging.debug(f"Value of number = {number}")
Output
DEBUG:root:Value of number = 25
INFO
Records normal application events.
logging.info("Application Started")
Example messages:
User Logged In Payment Successful File Uploaded
WARNING
Indicates something unexpected but not fatal.
logging.warning("Low Disk Space")
Example:
Password expires in 5 days API nearing rate limit
ERROR
Used when an operation fails.
try: 10 / 0 except ZeroDivisionError: logging.error("Cannot divide by zero.")
CRITICAL
Represents severe failures requiring immediate attention.
logging.critical("Database Server Unavailable")
Logging to a File
Instead of displaying logs on the console, store them in a file.
import logging logging.basicConfig( filename="application.log", level=logging.INFO ) logging.info("Application Started")
The file application.log now contains:
INFO:root:Application Started
Log Message Format
Customize log entries for better readability.
import logging logging.basicConfig( level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s" ) logging.info("Application Started")
Example output:
2026-08-02 10:15:30 INFO Application Started
Capturing Exception Details
Use logging.exception() inside an except block to log both the error message and the full traceback.
import logging logging.basicConfig(level=logging.INFO) try: result = 10 / 0 except Exception: logging.exception("Unexpected error")
Output (truncated):
ERROR:root:Unexpected error Traceback (most recent call last): ... ZeroDivisionError: division by zero
Understanding the Stack Trace
A stack trace shows the sequence of function calls that led to an exception.
def divide(): return 10 / 0 def calculate(): divide() calculate()
Output:
Traceback (most recent call last): File "example.py", line 7 calculate() File "example.py", line 5 divide() File "example.py", line 2 return 10 / 0 ZeroDivisionError
Reading the traceback from bottom to top helps identify where the error originated and how it propagated.
Logging in AI Applications
AI systems often depend on external APIs and services.
Example:
import logging logging.basicConfig(level=logging.INFO) try: response = llm.generate(prompt) except TimeoutError: logging.error("LLM request timed out.") except Exception: logging.exception("AI inference failed.")
Logging helps identify:
- Model timeouts
- Invalid prompts
- Authentication failures
- Rate limit issues
- Token limit violations
Logging in Cloud Applications
Example:
import logging logging.basicConfig(level=logging.INFO) try: upload_to_s3() except PermissionError: logging.error("Permission denied while uploading to S3.") except Exception: logging.exception("Cloud upload failed.")
Logging in DevOps Automation
import logging logging.basicConfig(level=logging.INFO) try: deploy_application() logging.info("Deployment successful.") except Exception: logging.exception("Deployment failed.")
Logs allow teams to determine:
- Which deployment failed
- When it failed
- Why it failed
Logging in Full Stack Development
import logging logging.basicConfig(level=logging.INFO) try: save_user(user_data) except Exception: logging.exception("Failed to save user.")
Instead of exposing technical details to users, the application logs the exception while returning a friendly error message.
Retry Logic
Some failures are temporary.
import time attempt = 1 while attempt <= 3: try: print("Connecting...") raise TimeoutError("Network Timeout") except TimeoutError: print(f"Retry {attempt}") attempt += 1 time.sleep(2)
This pattern is common when dealing with unstable networks or external services.
Best Practices
-
Use
logginginstead ofprint()in production. - Choose the appropriate log level.
- Include meaningful context in log messages.
- Avoid logging sensitive information such as passwords or API keys.
-
Use
logging.exception()to capture tracebacks. - Rotate log files to prevent excessive disk usage.
- Centralize logs for distributed applications.
Observability in Modern Systems
Logging is one part of observability, which also includes metrics and traces.
Typical monitoring stack:
Application │ ▼ Logging │ ▼ Central Log Storage │ ▼ Dashboards & Alerts
Common tools include:
- ELK Stack (Elasticsearch, Logstash, Kibana)
- Grafana Loki
- OpenTelemetry
- Prometheus (metrics)
- AWS CloudWatch
- Azure Monitor
- Google Cloud Logging
These tools help engineering teams monitor applications, investigate incidents, and improve reliability.
Career Relevance
Logging and monitoring are essential skills for:
- Python Developers
- AI Engineers
- Machine Learning Engineers
- Cloud Engineers
- DevOps Engineers
- Site Reliability Engineers (SRE)
- Backend Developers
- Platform Engineers
Interviewers often ask candidates how they would diagnose production failures, making practical knowledge of logging and observability highly valuable.
Chapter Summary
In this chapter, you learned:
-
Why
print()is insufficient for production environments. -
How to use Python's
loggingmodule. - The purpose of different log levels.
- How to record logs to files.
-
How to capture stack traces with
logging.exception(). - How logging supports AI, Cloud, DevOps, and Full Stack applications.
- The role of logging within modern observability practices.
Interview Questions
-
Why should production applications use
logginginstead ofprint()? - What are the five standard logging levels in Python?
-
What is the difference between
logging.error()andlogging.exception()? - How do you configure logging to write to a file?
- What information does a stack trace provide?
- Why is it important to avoid logging sensitive information?
- What is retry logic, and when should it be used?
- How does logging improve AI application reliability?
- Name three tools commonly used for centralized logging.
- How does logging contribute to observability?
Next Chapter: Advanced Exception Handling Patterns
In the next chapter, we'll explore advanced topics such as exception chaining (raise ... from ...), creating reusable exception hierarchies, context managers, resource cleanup with with, retry libraries, asynchronous (async/await) exception handling, concurrency, and production-grade error handling patterns used in enterprise AI, cloud-native, and microservices applications.
Python Exception Handling Masterclass
Chapter 6: Advanced Exception Handling Patterns
Learning Objectives
After completing this chapter, you will be able to:
-
Understand exception chaining (
raise ... from ...) - Re-raise exceptions correctly
- Suppress exception chaining
- Create enterprise-grade custom exception hierarchies
- Handle nested exceptions
-
Use context managers (
with) - Handle exceptions in threads
-
Handle exceptions in asynchronous programming (
asyncio) - Implement retry patterns
- Design production-ready applications
Why Advanced Exception Handling?
Imagine you are building:
- ChatGPT-like AI Assistant
- Banking System
- AWS Automation Tool
- Kubernetes Deployment Engine
- E-Commerce Platform
- Healthcare Application
These applications involve
- Multiple APIs
- Databases
- Authentication
- Network Calls
- File Processing
- Background Jobs
One exception may trigger another.
Professional developers preserve the original error while providing business-friendly messages.
Exception Chaining
Suppose a file doesn't exist.
try: open("student.txt") except FileNotFoundError: raise Exception("Unable to load student profile")
Output
Exception: Unable to load student profile
The original reason is lost.
Using raise ... from
try: open("student.txt") except FileNotFoundError as e: raise Exception("Unable to load student profile") from e
Output
FileNotFoundError ↓ Exception Unable to load student profile
Now developers can see
Original Problem
AND
Business Exception
Why is Exception Chaining Important?
Imagine an AI application.
User ↓ Prompt ↓ OpenAI API ↓ Vector DB ↓ Database
Database fails.
Should users see
psycopg2.OperationalError
No.
Instead
Unable to process your request. Please try again later.
But developers still need the database exception.
Exception chaining preserves both.
Re-Raising Exceptions
Sometimes you want to log an exception and allow another layer to handle it.
Example
try: result = 10 / 0 except ZeroDivisionError: print("Logging Error...") raise
Output
Logging Error... ZeroDivisionError
Notice
The same exception continues upward.
Why Re-Raise?
Example Architecture
Frontend ↓ REST API ↓ Business Layer ↓ Database
Business Layer
Log Error ↓ Raise Again ↓ API returns HTTP 500
Incorrect Re-Raising
Bad
except Exception: raise Exception("Something Failed")
Original exception disappears.
Better
except Exception: raise
Suppressing Exception Chaining
Sometimes you intentionally hide internal implementation.
try: open("abc.txt") except FileNotFoundError: raise ValueError("Invalid Input") from None
Output
ValueError Invalid Input
Original exception hidden.
Useful when
- Security
- API Responses
- Public Applications
Nested Try Blocks
try: print("Outer") try: print(10 / 0) except ZeroDivisionError: print("Inner Handler") except: print("Outer Handler")
Output
Outer Inner Handler
Nested Example 2
try: try: raise ValueError() except TypeError: print("Type Error") except ValueError: print("Outer Value Error")
Output
Outer Value Error
Multiple Layers
Application ↓ Controller ↓ Service ↓ DAO ↓ Database
Every layer may
Catch
↓
Log
↓
Raise Again
Custom Exception Hierarchy
Instead of creating random exceptions
Create a hierarchy.
class EduarnError(Exception): pass
Now
class AIError(EduarnError): pass class CloudError(EduarnError): pass class DevOpsError(EduarnError): pass class DatabaseError(EduarnError): pass
Even more
EduarnError │ ├── AIError │ ├── PromptError │ ├── TokenLimitError │ └── ModelError │ ├── CloudError │ ├── AWSConnectionError │ ├── AzureError │ └── GCPError │ ├── DevOpsError │ ├── DockerError │ ├── KubernetesError │ └── JenkinsError
Very common in enterprise software.
Example
class AIError(Exception): pass class PromptError(AIError): pass raise PromptError("Prompt Too Large")
Now
except AIError:
handles every AI exception.
Context Managers
Instead of
file = open("abc.txt") try: print(file.read()) finally: file.close()
Professional Python
with open("abc.txt") as file: print(file.read())
Python automatically closes the file.
Why Context Managers?
Resources
- Files
- Database Connections
- Network Sockets
- GPU Memory
- AI Models
- Locks
must always be released.
Database Example
with connection.cursor() as cursor: cursor.execute(sql)
Cursor automatically closes.
AI Example
with torch.no_grad(): prediction = model(image)
Resources released efficiently.
Thread Exception Handling
Example
import threading def worker(): print(10 / 0) thread = threading.Thread(target=worker) thread.start()
Thread exceptions don't automatically stop the main program.
Production applications should catch and log exceptions inside worker threads.
Async Exception Handling
Modern AI systems use asynchronous programming.
import asyncio async def download(): raise ConnectionError() async def main(): try: await download() except ConnectionError: print("Retry") asyncio.run(main())
Exception Handling in Async Tasks
Multiple AI API calls
Prompt 1 ↓ LLM Prompt 2 ↓ LLM Prompt 3 ↓ LLM
One request fails.
Others continue.
Exception handling keeps the application responsive.
Retry Pattern
Simple Retry
attempt = 1 while attempt <= 3: try: raise TimeoutError() except TimeoutError: print("Retry", attempt) attempt += 1
Exponential Backoff
Professional cloud systems
Retry 1 → 1 sec Retry 2 → 2 sec Retry 3 → 4 sec Retry 4 → 8 sec
Reduces server load.
AI Retry Example
OpenAI Timeout ↓ Retry ↓ Retry ↓ Retry ↓ Success
Very common in
- Azure OpenAI
- OpenAI
- Claude
- Gemini
Circuit Breaker Concept
Suppose database keeps failing.
Instead of
Retry Forever
Professional systems
Failure ↓ Failure ↓ Failure ↓ Open Circuit ↓ Reject Requests ↓ Recover Later
Popular libraries
- pybreaker
- resilience patterns
Production Architecture
User ↓ REST API ↓ Authentication ↓ Business Logic ↓ AI Service ↓ Database ↓ Cloud Storage
Every layer
- Logs exceptions
- Adds business context
- Re-raises exceptions
- Cleans resources
- Returns user-friendly messages
Enterprise Best Practices
✔ Catch only what you can handle.
✔ Never hide exceptions.
✔ Preserve original exceptions using raise ... from.
✔ Use context managers (with) whenever possible.
✔ Build custom exception hierarchies.
✔ Separate business exceptions from system exceptions.
✔ Log before re-raising.
✔ Avoid exposing internal error details to end users.
✔ Use retry with exponential backoff for transient failures.
✔ Fail fast for unrecoverable errors.
Common Mistakes
❌ Catching every exception with a bare except.
❌ Ignoring exceptions.
❌ Using pass without logging.
❌ Exposing database errors to users.
❌ Losing the original exception.
❌ Not cleaning up resources.
❌ Retrying forever.
❌ Mixing business logic with exception handling.
Interview Questions
- What is exception chaining in Python?
-
Why would you use
raise ... from ...? -
What does
raisewithout arguments do inside anexceptblock? -
When would you suppress exception chaining using
from None? - What are the benefits of a custom exception hierarchy?
-
Why are context managers preferred over explicit
try...finallyfor resource management? - How should exceptions be handled in worker threads?
- What challenges arise when handling exceptions in asynchronous code?
- What is exponential backoff, and why is it important for cloud applications?
- How does a circuit breaker improve system resilience?
Hands-on Exercises
Exercise 1
Create a custom exception hierarchy for an online banking application with exceptions such as BankError, InsufficientFundsError, and AccountLockedError.
Exercise 2
Read a configuration file using a with statement. If the file is missing, raise a custom ConfigurationError while preserving the original exception.
Exercise 3
Build a retry mechanism with exponential backoff that retries a simulated API call up to five times before raising an exception.
Exercise 4
Create an asynchronous function that fetches data, handles ConnectionError, logs the exception, and retries the operation.
Next Chapter: Exception Handling in AI, Generative AI, LLMs, RAG, AI Agents, and MLOps
We'll explore production-grade exception handling for modern AI systems, including OpenAI, Azure OpenAI, Gemini, Claude, LangChain, LangGraph, CrewAI, AutoGen, Retrieval-Augmented Generation (RAG), vector databases, embeddings, streaming responses, tool calling, and AI agent workflows. You'll learn patterns used by AI engineers to build reliable, scalable, and fault-tolerant intelligent applications.
Python Exception Handling Masterclass
Chapter 7: Exception Handling in AI, Generative AI, LLMs, RAG & AI Agents
Building Reliable Artificial Intelligence Applications with Python
Learning Objectives
After completing this chapter, you will understand:
- Why exception handling is critical in AI applications.
- Common failures in Generative AI systems.
- Handling errors in LLM API calls.
- Managing token limits and rate limits.
- Exception handling in RAG applications.
- Handling vector database failures.
- Building reliable AI agents.
- Implementing retry and fallback strategies.
- Designing production-ready AI systems.
Why Exception Handling is More Important in AI
Traditional software:
User | Application | Database
AI applications are much more complex:
User | Frontend | API Layer | Prompt Processing | LLM Model | Embedding Model | Vector Database | External Tools | Cloud Services
Every layer can fail.
Examples:
- User sends an empty prompt.
- AI API key expires.
- Model server is unavailable.
- Token limit exceeded.
- Vector database is down.
- Tool calling fails.
- Generated response is invalid.
- Network connection times out.
Without proper exception handling:
AI Application Crash | | User sees "Internal Server Error"
With professional exception handling:
AI Application | | Detect Error | | Log Details | | Retry / Fallback | | Friendly Response
Common AI Application Exceptions
AI systems commonly experience:
| Exception | Reason |
|---|---|
| AuthenticationError | Invalid API key |
| RateLimitError | Too many requests |
| TimeoutError | Model response delayed |
| ConnectionError | Network issue |
| ValueError | Invalid input |
| TokenLimitError | Context too large |
| JSONDecodeError | Invalid AI output |
| ModelNotFoundError | Wrong model name |
Example 1: Basic AI API Exception Handling
Imagine calling an AI model:
def generate_response(prompt): response = ai_model.generate(prompt) return response print(generate_response("Explain Python"))
Problem:
If the API fails:
ConnectionError Program stops
Improved Version
def generate_response(prompt): try: response = ai_model.generate(prompt) return response except ConnectionError: return "AI service temporarily unavailable." except TimeoutError: return "AI response timeout. Please try again." except Exception as e: print(e) return "Unexpected AI error."
Validating AI Prompts
Never directly send user input to an AI model.
Bad:
prompt = input() response = model.generate(prompt)
Problem:
User enters:
(empty message)
or
10 MB unwanted text
Better:
def validate_prompt(prompt): if not prompt.strip(): raise ValueError( "Prompt cannot be empty" ) if len(prompt) > 5000: raise ValueError( "Prompt exceeds limit" )
Usage:
try: validate_prompt(user_prompt) answer = model.generate(user_prompt) except ValueError as e: print(e)
Handling LLM Authentication Errors
Example:
try: response = openai_client.chat.completions.create( model="gpt-model", messages=[] ) except PermissionError: print( "Invalid API credentials" )
Common causes:
- Expired API key
- Wrong environment variable
- Incorrect permissions
Environment Variable Validation
Production AI systems store secrets separately.
Example:
import os api_key = os.getenv( "OPENAI_API_KEY" ) if not api_key: raise EnvironmentError( "API key missing" )
Handling Token Limit Errors
LLMs have context limits.
Example:
Prompt + Conversation History + Documents = Tokens
If tokens exceed limits:
TokenLimitError
Example:
class TokenLimitError(Exception): pass def check_tokens(text): tokens = len(text.split()) if tokens > 4000: raise TokenLimitError( "Input exceeds token limit" )
RAG Application Exception Handling
Retrieval-Augmented Generation (RAG):
User Question | | Embedding Model | | Vector Database | | Relevant Documents | | LLM | | Answer
Failures:
- Embedding failure
- Database unavailable
- No documents found
- Invalid metadata
- Model timeout
RAG Example
try: documents = vector_db.search( question ) answer = llm.generate( documents ) except ConnectionError: print( "Vector database unavailable" ) except Exception as e: print( "RAG Error:", e )
Handling No Search Results
Important RAG scenario:
documents = vector_db.search(query) if not documents: raise ValueError( "No relevant documents found" )
Instead of generating a wrong answer.
Vector Database Exception Handling
Popular vector databases:
- FAISS
- ChromaDB
- Pinecone
- Milvus
- Weaviate
Example:
try: results = pinecone.query( vector=data ) except TimeoutError: retry_request() except Exception: log_error()
AI Agent Exception Handling
Modern AI agents:
Agent | |---- Search Tool | |---- Database Tool | |---- API Tool | |---- Calculator Tool | |---- LLM
Any tool can fail.
Example:
def execute_tool(tool): try: result = tool.run() return result except Exception as e: return { "error": str(e) }
Tool Calling Failure
Example:
AI decides:
Call Weather API
But:
Weather API Down
Without handling:
Agent stops.
With handling:
Tool Failed | Try Backup Tool | Return Response
Retry Pattern for AI APIs
AI APIs may fail temporarily.
Example:
import time def call_ai(): attempts = 3 for i in range(attempts): try: return model.generate() except TimeoutError: time.sleep(2) raise Exception( "AI service unavailable" )
Exponential Backoff
Professional cloud AI systems use:
Attempt 1 Wait 1 second Attempt 2 Wait 2 seconds Attempt 3 Wait 4 seconds Attempt 4 Wait 8 seconds
Why?
Because immediate retries increase server pressure.
AI Fallback Strategy
Production systems rarely depend on one model.
Example:
Primary Model GPT Model | Failure ↓ Fallback Model Open Source Model
Example:
try: response = gpt_model.generate() except Exception: response = local_model.generate()
Handling Invalid AI Output
AI output may not always be valid.
Example:
Expected:
{ "name":"John", "age":30 }
Received:
John is 30 years old
Handling:
import json try: data = json.loads( ai_response ) except json.JSONDecodeError: print( "Invalid AI format" )
Logging AI Errors
Never store:
API Keys Passwords Private Data
Example:
import logging try: response = model.generate(prompt) except Exception: logging.exception( "AI generation failed" )
Production AI Architecture
User | API Gateway | Validation Layer | AI Service | Exception Handler | Logging | Monitoring | Response
Monitoring AI Applications
Professional AI systems use:
- Application logs
- Metrics
- Tracing
- Error tracking
Tools:
- OpenTelemetry
- Prometheus
- Grafana
- CloudWatch
- Azure Monitor
- Application Insights
Career Importance
AI exception handling skills are required for:
AI Engineer
- LLM integration
- RAG pipelines
- AI agents
MLOps Engineer
- Model deployment
- Monitoring
- Reliability
Cloud Engineer
- AI infrastructure
- Scaling
- Automation
Backend Developer
- AI APIs
- Enterprise applications
Best Practices for AI Exception Handling
✅ Validate prompts before processing.
✅ Handle API failures gracefully.
✅ Use retries with exponential backoff.
✅ Create custom AI exceptions.
✅ Log failures without exposing secrets.
✅ Validate AI-generated output.
✅ Build fallback mechanisms.
✅ Monitor production AI systems.
✅ Separate technical errors from user messages.
Chapter Summary
In this chapter, you learned:
- Why AI applications require advanced exception handling.
- How to handle LLM failures.
- Prompt validation techniques.
- RAG error handling.
- Vector database failures.
- AI agent reliability patterns.
- Retry and fallback strategies.
- Production AI monitoring.
Interview Questions
- Why is exception handling more important in AI applications?
- How would you handle an LLM API timeout?
- What happens when an AI model exceeds token limits?
- How do you handle invalid JSON generated by an LLM?
- Explain exception handling in a RAG pipeline.
- Why are fallback models useful?
- What is exponential backoff?
- How would you design error handling for an AI agent?
- Why should API keys never be logged?
- What monitoring tools are used for production AI systems?
Next Chapter: Exception Handling in Cloud Computing (AWS, Azure, Google Cloud & Serverless Applications)
In the next chapter, we will cover:
- Python exception handling with AWS SDK (Boto3)
- Azure SDK error handling
- Google Cloud exceptions
- Lambda function failures
- Cloud API retries
- Authentication errors
- Storage failures
- Production cloud automation patterns used by Cloud Engineers and DevOps teams.
Python Exception Handling Masterclass
Chapter 8: Exception Handling in Cloud Computing
AWS, Azure, Google Cloud, Serverless & Cloud Automation with Python
Learning Objectives
After completing this chapter, you will understand:
- Why cloud applications need advanced exception handling.
- Handling AWS, Azure, and Google Cloud failures.
- Python exception handling with cloud SDKs.
- Authentication and authorization errors.
- Cloud storage exception handling.
- API timeout and retry strategies.
- Serverless error handling.
- Designing reliable cloud automation scripts.
Why Exception Handling is Critical in Cloud Applications
Traditional applications usually depend on local resources.
Example:
Application | | Local Database
Cloud applications depend on many distributed services:
User | Application | Cloud API | Compute Service | Database | Storage | External Services
Every connection introduces possible failures.
Examples:
- Internet connection failure
- Cloud service outage
- Invalid credentials
- Permission denied
- Resource unavailable
- API throttling
- Network timeout
- Service quota exceeded
A cloud engineer must design applications that expect failures.
Cloud Failure Categories
Cloud exceptions generally fall into these categories:
1. Authentication Errors
Problem:
Invalid Access Key Expired Token Wrong Credentials
Example:
AuthenticationError
2. Authorization Errors
User is authenticated but does not have permission.
Example:
User can login but cannot access S3 bucket
Exception:
PermissionError
3. Resource Errors
Resource does not exist.
Examples:
- Missing VM
- Missing Storage Bucket
- Deleted Database
4. Network Errors
Examples:
- Connection timeout
- DNS failure
- Temporary network interruption
5. Service Errors
Cloud provider service failures.
Examples:
- AWS S3 outage
- Azure Storage issue
- Google Cloud API unavailable
Exception Handling with AWS Using Boto3
AWS provides Python SDK called:
boto3
Example services:
- S3
- EC2
- Lambda
- DynamoDB
- CloudWatch
Example: Upload File to AWS S3
Without Exception Handling:
import boto3 s3 = boto3.client("s3") s3.upload_file( "data.txt", "my-bucket", "data.txt" )
Possible failures:
NoCredentialsError AccessDenied BucketNotFound Network Error
Professional Version
import boto3 from botocore.exceptions import ClientError s3 = boto3.client("s3") try: s3.upload_file( "data.txt", "my-bucket", "data.txt" ) print("Upload Successful") except ClientError as e: print( "AWS Error:", e ) except Exception as e: print( "Unexpected Error:", e )
Handling AWS Permission Error
Example:
try: s3.download_file( "private-bucket", "secret.txt", "secret.txt" ) except ClientError as e: error_code = e.response[ "Error" ]["Code"] if error_code == "AccessDenied": print( "Permission denied" )
AWS Retry Strategy
Cloud APIs can fail temporarily.
Example:
Request | Timeout | Retry | Success
Simple retry:
import time for attempt in range(3): try: upload_file() break except Exception: time.sleep(2)
Exponential Backoff
Professional approach:
Attempt 1 Wait 1 second Attempt 2 Wait 2 seconds Attempt 3 Wait 4 seconds
Example:
import time for attempt in range(5): try: call_cloud_api() break except Exception: delay = 2 ** attempt time.sleep(delay)
AWS Lambda Exception Handling
Lambda functions are event-driven.
Architecture:
API Gateway | Lambda | Database
Example:
def lambda_handler(event, context): try: process_request(event) return { "statusCode":200, "message":"Success" } except Exception as e: return { "statusCode":500, "message": "Internal Error" }
Lambda Best Practices
Do:
✅ Log exceptions
✅ Return proper status codes
✅ Retry temporary failures
✅ Validate input
Avoid:
❌ Exposing internal errors
❌ Printing secrets
Azure Exception Handling with Python
Azure services:
- Azure Storage
- Azure Functions
- Azure OpenAI
- Azure Kubernetes Service
- Azure SQL
Python SDK:
azure-sdk
Example: Azure Blob Storage
from azure.core.exceptions import ( ResourceNotFoundError, AzureError ) try: download_blob() except ResourceNotFoundError: print( "File does not exist" ) except AzureError as e: print( "Azure Error:", e )
Azure OpenAI Exception Handling
Example:
try: response = client.chat.completions.create( model="gpt-model", messages=[] ) except Exception as e: print( "Azure OpenAI Failed", e )
Common issues:
- Deployment unavailable
- Token limit exceeded
- API key failure
- Rate limit exceeded
Google Cloud Exception Handling
Google Cloud Python SDK:
Services:
- Cloud Storage
- Compute Engine
- BigQuery
- Vertex AI
Example:
from google.api_core.exceptions import ( NotFound, PermissionDenied ) try: bucket.get_blob( "file.txt" ) except NotFound: print( "File missing" ) except PermissionDenied: print( "Access denied" )
Cloud Storage Exception Pattern
Common architecture:
Application | Storage Service | Exception Handler | Retry / Alert
Example:
try: upload_document() except TimeoutError: retry_upload() except PermissionError: notify_admin() except Exception: log_failure()
Database Exception Handling in Cloud
Cloud databases:
- AWS RDS
- Azure SQL
- Cloud SQL
- DynamoDB
Example:
try: connection.execute(query) except ConnectionError: print( "Database unavailable" ) finally: connection.close()
Secrets Management
Never hardcode:
API_KEY="12345"
Use:
- AWS Secrets Manager
- Azure Key Vault
- Google Secret Manager
Example:
import os api_key=os.getenv( "API_KEY" ) if not api_key: raise EnvironmentError( "Missing API Key" )
Cloud Automation Example
A DevOps automation script:
try: create_server() configure_security() deploy_application() except PermissionError: rollback() except TimeoutError: retry() except Exception: send_alert()
Exception Handling in Infrastructure as Code
Tools:
- Terraform
- Ansible
- CloudFormation
Example flow:
Terraform Apply | Failure | Capture Error | Rollback | Notify Team
Python automation can:
- Parse errors
- Retry operations
- Trigger alerts
Cloud Monitoring Integration
Production systems send exceptions to:
- AWS CloudWatch
- Azure Monitor
- Google Cloud Logging
- Grafana
- Prometheus
- OpenTelemetry
Example:
import logging try: deploy_application() except Exception: logging.exception( "Deployment Failed" )
Cloud Exception Architecture
Enterprise design:
User | API Gateway | Application Layer | Exception Middleware | Cloud Services | Logging System | Monitoring Alert
Real-World Cloud Scenario
E-Commerce Application
Order Processing:
Customer Order | Payment Service | Inventory Service | Shipping Service
Possible failure:
Inventory API unavailable.
Bad design:
Application Crash
Good design:
Catch Exception | Retry | Queue Request | Notify Team
Best Practices for Cloud Exception Handling
✅ Handle cloud SDK-specific exceptions.
✅ Use retries for temporary failures.
✅ Use exponential backoff.
✅ Monitor application logs.
✅ Never expose cloud credentials.
✅ Store secrets securely.
✅ Implement fallback strategies.
✅ Design applications assuming failure.
✅ Use centralized monitoring.
Career Relevance
Cloud exception handling skills are important for:
Cloud Engineer
- AWS
- Azure
- Google Cloud
DevOps Engineer
- Automation
- CI/CD
- Infrastructure
SRE Engineer
- Reliability
- Monitoring
- Incident Management
AI Engineer
- Cloud AI APIs
- Model deployment
- Production systems
Chapter Summary
In this chapter, you learned:
- Why cloud applications fail.
- AWS exception handling with Boto3.
- Azure SDK error handling.
- Google Cloud exception handling.
- Lambda failure management.
- Retry and backoff strategies.
- Cloud monitoring practices.
- Production cloud reliability patterns.
Interview Questions
- Why is exception handling important in cloud applications?
- How do you handle AWS SDK exceptions in Python?
- What is exponential backoff and why is it used?
- Difference between authentication and authorization errors?
- How do Lambda functions handle exceptions?
- How do you handle Azure SDK failures?
- Why should cloud applications implement retries?
- How do you securely handle API keys?
- What monitoring tools collect cloud application errors?
- How would you design a fault-tolerant cloud application?
Next Chapter: Exception Handling in DevOps, CI/CD, Docker, Kubernetes & SRE
Next we will cover:
- Python exception handling in Jenkins pipelines
- GitHub Actions failures
- Docker automation errors
- Kubernetes deployment failures
- Helm errors
- Terraform exceptions
- Ansible error handling
- SRE reliability patterns
- Incident management and production troubleshooting.
Python Exception Handling Masterclass
Chapter 9: Exception Handling in DevOps, CI/CD, Docker, Kubernetes & SRE
Building Reliable Automation and Production Systems with Python
Learning Objectives
After completing this chapter, you will understand:
- Why exception handling is critical in DevOps automation.
- Handling failures in CI/CD pipelines.
- Python exception handling with Jenkins, GitHub Actions, and GitLab CI/CD.
- Managing Docker and Kubernetes deployment failures.
- Error handling in Infrastructure as Code.
- SRE reliability patterns.
- Incident management and production troubleshooting.
Why Exception Handling Matters in DevOps
Modern software delivery is automated.
A typical enterprise pipeline:
Developer | Git Commit | CI Pipeline | Build | Testing | Docker Image | Kubernetes Deployment | Production
At every stage, something can fail.
Examples:
- Code compilation failure
- Unit test failure
- Docker build error
- Image push failure
- Kubernetes pod crash
- Deployment timeout
- Infrastructure provisioning error
A DevOps engineer must ensure:
Failure | Detect | Capture Error | Notify | Recover | Continue Service
CI/CD Pipeline Failure Handling
A CI/CD pipeline executes many automated steps.
Example:
Checkout Code ↓ Install Dependencies ↓ Run Tests ↓ Build Application ↓ Deploy
Poor Pipeline Design
Example:
deploy_application()
If deployment fails:
Pipeline Failed No Information No Recovery
Professional Approach
try: build_application() run_tests() deploy_application() except Exception as e: send_alert(e) rollback()
Python Automation Script Example
DevOps scripts often automate:
- Server creation
- Deployment
- Backup
- Monitoring
- Configuration
Example:
import logging logging.basicConfig( level=logging.INFO ) try: logging.info( "Starting deployment" ) deploy() logging.info( "Deployment successful" ) except Exception: logging.exception( "Deployment failed" )
Jenkins Pipeline Exception Handling
Jenkins pipeline example:
pipeline { stages { stage('Deploy') { steps { sh 'python deploy.py' } } } }
If Python fails:
Exit Code != 0 ↓ Jenkins marks build failed
Returning Proper Exit Codes
DevOps tools depend on exit codes.
Success:
import sys sys.exit(0)
Failure:
sys.exit(1)
Example:
try: deploy() except Exception: print( "Deployment Failed" ) sys.exit(1)
Jenkins understands:
0 = SUCCESS 1 = FAILURE
GitHub Actions Exception Handling
Example workflow:
name: Deploy jobs: deploy: runs-on: ubuntu-latest steps: - name: Deploy run: python deploy.py
If Python returns:
exit 1
GitHub Actions stops.
Handling Failure in GitHub Actions
Example:
- name: Deploy run: python deploy.py continue-on-error: true
Useful when:
- Running optional checks
- Collecting reports
Notifications After Failure
Production pipelines send alerts.
Flow:
Pipeline Failure | Exception Handler | Slack / Email / Teams | Engineer Notification
Python example:
try: deploy() except Exception as e: send_slack_message( str(e) ) raise
Docker Exception Handling
Docker failures happen during:
- Image build
- Container startup
- Runtime execution
Docker Build Example
Command:
docker build .
Possible errors:
Missing Dependency Wrong Dockerfile Network Failure
Python automation:
import subprocess try: subprocess.run( [ "docker", "build", "." ], check=True ) except subprocess.CalledProcessError: print( "Docker build failed" )
Docker Container Monitoring
Example:
try: start_container() except Exception: restart_container() notify_team()
Kubernetes Exception Handling
Kubernetes manages containers.
Architecture:
User | Kubernetes API | Deployment | Pods | Containers
Common Kubernetes failures:
| Error | Reason |
|---|---|
| CrashLoopBackOff | Application crash |
| ImagePullBackOff | Image unavailable |
| Pending | Resource shortage |
| FailedScheduling | Node issue |
| OOMKilled | Memory exceeded |
Kubernetes Deployment Automation
Python example:
try: deploy_kubernetes_app() except Exception: rollback_deployment() send_alert()
Handling Pod Failures
Example:
Pod Started | Application Error | Container Exit | Kubernetes Restart
Python monitoring:
try: check_pods() except Exception as e: logging.error( "Pod monitoring failed" )
Kubernetes API Exception Handling
Using Kubernetes Python Client:
from kubernetes.client.rest import ApiException try: api.create_namespaced_pod( body=pod ) except ApiException as e: print( "Kubernetes Error:", e )
Helm Deployment Errors
Helm manages Kubernetes packages.
Common failures:
Invalid YAML Wrong Values Missing Secret Template Error
Automation:
try: helm_install() except Exception: helm_rollback()
Terraform Exception Handling
Infrastructure as Code:
Terraform | Cloud Resources | AWS/Azure/GCP
Failures:
- Permission issue
- Resource conflict
- Invalid configuration
Python wrapper:
import subprocess try: subprocess.run( [ "terraform", "apply" ], check=True ) except subprocess.CalledProcessError: print( "Terraform failed" )
Ansible Error Handling
Ansible provides:
ignore_errors: yes
Example:
- name: Install package yum: name: nginx ignore_errors: yes
Better:
block: - name: Deploy command: deploy.sh rescue: - name: Rollback command: rollback.sh
Similar to Python:
try: deploy() except: rollback()
SRE Exception Handling Principles
Site Reliability Engineering focuses on:
- Availability
- Reliability
- Performance
- Recovery
Error Budget Concept
SRE teams define:
Allowed Failure + Required Reliability
Example:
99.9% uptime = 43 minutes downtime/month
Incident Management Flow
Production failure:
Alert | Detection | Investigation | Fix | Root Cause Analysis | Prevention
Root Cause Analysis Example
Problem:
Website Down
Investigation:
Application Error ↓ Database Connection Failure ↓ Expired Database Password
Solution:
Secret Rotation Automation
Observability in DevOps
Three pillars:
1. Logs
"What happened?"
Example:
Application Error
2. Metrics
"How much?"
Example:
CPU 95% Memory 90%
3. Traces
"Where did it fail?"
Example:
API | Service A | Database
DevOps Monitoring Tools
Common tools:
- Prometheus
- Grafana
- ELK Stack
- OpenTelemetry
- Splunk
- Datadog
- CloudWatch
- Azure Monitor
Production Error Handling Architecture
Developer | Git Repository | CI/CD Pipeline | Exception Handler | Logging System | Monitoring | Alert | Engineer | Recovery
Best Practices
✅ Always return correct exit codes.
✅ Fail pipelines clearly.
✅ Capture complete logs.
✅ Never hide deployment failures.
✅ Implement rollback strategies.
✅ Automate recovery wherever possible.
✅ Use monitoring and alerting.
✅ Store secrets securely.
✅ Test failure scenarios.
✅ Document incident solutions.
Career Relevance
These skills are required for:
DevOps Engineer
- CI/CD automation
- Deployment reliability
- Infrastructure
Cloud Engineer
- Cloud automation
- Recovery systems
SRE Engineer
- Production reliability
- Incident response
MLOps Engineer
- AI model deployment
- Monitoring
Interview Questions
- Why are exit codes important in CI/CD pipelines?
- How does Jenkins detect deployment failure?
- How can Python scripts fail safely in automation?
- What happens when a Kubernetes pod crashes?
- Explain CrashLoopBackOff.
- How do you automate rollback after failure?
- Difference between logs, metrics, and traces?
- What is the role of exception handling in SRE?
- How do Docker build failures get detected?
- How would you design a fault-tolerant deployment pipeline?
Hands-on Projects
Project 1: Automated Deployment Script
Build a Python tool that:
- Pulls code from Git
- Builds Docker image
- Deploys Kubernetes application
- Handles failures
- Sends notifications
Project 2: Kubernetes Health Monitor
Create a Python application that:
- Checks pod status
- Detects failures
- Restarts unhealthy services
- Sends alerts
Project 3: CI/CD Failure Analyzer
Build a Python tool that:
- Reads pipeline logs
- Detects errors
- Categorizes failures
- Generates reports
Chapter Summary
You learned:
- Exception handling in DevOps automation.
- CI/CD failure management.
- Jenkins and GitHub Actions integration.
- Docker error handling.
- Kubernetes failure recovery.
- Terraform and Ansible error management.
- SRE reliability patterns.
- Production troubleshooting methods.
Next Chapter: Python Exception Handling in Full Stack Applications (Backend APIs, Django, Flask, FastAPI, Databases & Microservices)
Next we will cover:
- REST API exception handling
- HTTP status codes
- FastAPI error handling
- Flask middleware
- Database transaction failures
- Microservices communication errors
- API Gateway failures
- Enterprise backend design patterns.
Python Exception Handling Masterclass
Chapter 10: Exception Handling in Full Stack Applications
Backend APIs, Django, Flask, FastAPI, Databases & Microservices
Building Enterprise-Grade Python Applications with Reliable Error Handling
Modern full-stack applications are not just about writing code that works. Professional applications must handle unexpected situations gracefully.
A production application must answer:
- What happens if a user sends invalid data?
- What happens if the database is unavailable?
- What happens if another API fails?
- How should the frontend receive errors?
- How do developers debug production issues?
This is where professional exception handling becomes essential.
Learning Objectives
After completing this chapter, you will understand:
- Exception handling in backend applications.
- REST API error handling patterns.
- HTTP status codes and exceptions.
- Flask exception handling.
- Django error management.
- FastAPI exception handlers.
- Database transaction failures.
- Microservices communication errors.
- Enterprise API design patterns.
Full Stack Application Architecture
A modern application:
Frontend (React / Angular / Mobile) | API Layer | Backend Application (Django / Flask / FastAPI) | Business Logic | Database (PostgreSQL / MySQL) | External Services
Every layer can generate errors.
Example:
User Login | API | Database | Password Verification
Possible failures:
- User not found
- Database timeout
- Invalid password
- Service unavailable
Why Backend Exception Handling Matters
Poor design:
Database Error | Crash Application | User sees: 500 Internal Server Error
Professional design:
Database Error | Exception Handler | Log Error | Return Safe Response | User sees: "Unable to login. Try again later."
HTTP Status Codes and Exception Handling
REST APIs communicate errors using HTTP status codes.
400 Bad Request
User sent invalid data.
Example:
{ "error":"Email format invalid" }
401 Unauthorized
Authentication failed.
Example:
Invalid Login Token
403 Forbidden
User authenticated but no permission.
Example:
Admin access required
404 Not Found
Resource does not exist.
Example:
User ID 500 not found
500 Internal Server Error
Unexpected server failure.
Example:
Database crashed
503 Service Unavailable
External service unavailable.
Example:
Payment Gateway Down
Flask Exception Handling
Flask is a popular Python web framework.
Basic API:
from flask import Flask app = Flask(__name__) @app.route("/users") def users(): data = database.get_users() return data
Problem:
If database fails:
Application crashes
Flask Try Except Pattern
from flask import Flask, jsonify app = Flask(__name__) @app.route("/users") def users(): try: data = database.get_users() return jsonify(data) except Exception as e: return jsonify( { "error": "Unable to fetch users" } ),500
Custom Flask Error Handler
Instead of repeating code:
@app.errorhandler(404) def not_found(error): return { "message": "Resource not found" },404
Now every 404 error uses this response.
Flask Custom Exceptions
Create application exceptions:
class UserNotFound(Exception): pass
Usage:
raise UserNotFound( "User does not exist" )
Handler:
@app.errorhandler(UserNotFound) def handle_user_error(error): return { "error":str(error) },404
Django Exception Handling
Django provides built-in exception management.
Example:
from django.http import JsonResponse def profile(request): try: user = User.objects.get( id=10 ) return JsonResponse( { "name":user.name } ) except User.DoesNotExist: return JsonResponse( { "error": "User not found" }, status=404 )
Django Database Exceptions
Common exceptions:
DatabaseError IntegrityError OperationalError
Example:
from django.db import DatabaseError try: save_customer() except DatabaseError: return { "error": "Database unavailable" }
FastAPI Exception Handling
FastAPI is widely used for:
- AI APIs
- Machine Learning APIs
- Microservices
Example:
from fastapi import FastAPI app = FastAPI() @app.get("/users") def users(): return { "users":[] }
FastAPI HTTPException
Professional approach:
from fastapi import HTTPException @app.get("/users/{id}") def user(id:int): user = find_user(id) if not user: raise HTTPException( status_code=404, detail="User not found" ) return user
Response:
{ "detail":"User not found" }
Global Exception Handler in FastAPI
Instead of handling everywhere:
from fastapi.responses import JSONResponse @app.exception_handler(Exception) async def global_exception_handler( request, exc ): return JSONResponse( status_code=500, content={ "message": "Internal Server Error" } )
Database Transaction Exception Handling
Important concept:
A transaction must either:
SUCCESS or ROLLBACK
Example:
try: create_order() update_inventory() payment() except Exception: rollback()
Banking Example
Transaction:
Transfer Money Account A -1000 | Account B +1000
Failure:
Money deducted Transfer failed
Bad.
Need:
Failure ↓ Rollback ↓ Restore Original State
SQL Exception Handling
Example:
try: cursor.execute(query) connection.commit() except Exception: connection.rollback() raise
Microservices Exception Handling
Modern applications:
User Service | Order Service | Payment Service | Notification Service
Every service can fail.
Example
Order Service:
try: payment_service.pay() except ConnectionError: raise PaymentError( "Payment service unavailable" )
API Timeout Handling
External API:
try: response = requests.get( url, timeout=5 ) except TimeoutError: return { "error": "Service timeout" }
Circuit Breaker Pattern
Used in microservices.
Without:
Service Down | 1000 Requests | System Collapse
With circuit breaker:
Failure | Open Circuit | Stop Requests | Recover | Resume
Input Validation Exception Handling
Never trust user input.
Example:
def register(email): if "@" not in email: raise ValueError( "Invalid email" )
API Validation Example
Request:
{ "name":"", "age":-5 }
Validation:
if age < 0: raise ValueError( "Invalid age" )
Logging API Exceptions
Production API:
import logging try: process_request() except Exception: logging.exception( "API Failed" ) raise
Logs contain:
- Timestamp
- API endpoint
- Error message
- Stack trace
Exception Middleware Architecture
Enterprise systems:
Request | Authentication Middleware | Validation Middleware | Business Logic | Exception Middleware | Database | Response
AI Full Stack Application Example
Architecture:
React UI | FastAPI Backend | LLM Service | Vector Database | Cloud Storage
Failures:
- Invalid prompt
- Model timeout
- Vector DB unavailable
- Token limit exceeded
Handling:
try: answer = ai_service.generate( prompt ) except TokenLimitError: return { "message": "Please shorten your question" }
Best Practices
✅ Never expose stack traces to users.
✅ Always log server errors.
✅ Create custom exception classes.
✅ Use correct HTTP status codes.
✅ Validate all user input.
✅ Rollback failed database transactions.
✅ Handle external API failures.
✅ Use middleware for global handling.
✅ Separate business errors from system errors.
Career Relevance
These skills are required for:
Python Backend Developer
- Django
- Flask
- FastAPI
- REST APIs
AI Engineer
- LLM APIs
- RAG applications
- AI Agents
Full Stack Developer
- Frontend + Backend integration
Cloud Engineer
- Distributed applications
Microservices Developer
- Enterprise systems
Interview Questions
- How do you handle exceptions in REST APIs?
- Difference between 400 and 500 errors?
- How does FastAPI handle exceptions?
- What is middleware exception handling?
- Why should database transactions use rollback?
- How do microservices handle failures?
- What is a circuit breaker pattern?
- Why should APIs not expose stack traces?
- How do you design global exception handling?
- How would you handle AI API failures in a backend service?
Hands-on Projects
Project 1: Build a FastAPI Error Management System
Features:
- Custom exceptions
- Global handlers
- Logging
- Database errors
- API validation
Project 2: AI Chat API
Build:
Frontend ↓ FastAPI ↓ LLM API ↓ Vector Database
Implement:
- Prompt validation
- Token errors
- Timeout handling
- Retry mechanism
Project 3: E-Commerce Backend
Implement:
- User service
- Order service
- Payment service
Handle:
- Database failures
- API failures
- Transaction rollback
Chapter Summary
You learned:
- Full-stack exception handling patterns.
- Flask, Django, and FastAPI error management.
- REST API error responses.
- Database transaction handling.
- Microservices failure management.
- AI backend exception patterns.
- Enterprise API reliability design.
Next Chapter: Python Exception Handling Interview Preparation & Real Production Scenarios
Next chapter will cover:
- 50+ Python exception handling interview questions
- Debugging real production failures
- Senior developer scenarios
- AI Engineer interview questions
- Cloud & DevOps troubleshooting cases
- SRE incident-based questions
- Coding exercises with solutions.
Python Exception Handling Masterclass
Chapter 11: Python Exception Handling Interview Preparation & Real Production Scenarios
From Beginner Developer to Senior Engineer Level
Exception handling is one of the most frequently tested areas in Python interviews because it shows how a developer thinks about application reliability, debugging, scalability, and production support.
A beginner thinks:
"How do I stop my program from crashing?"
A professional engineer thinks:
"How do I detect failure, recover safely, provide meaningful information, and keep the system reliable?"
Section 1: Basic Python Exception Handling Interview Questions
Q1. What is an exception in Python?
Answer:
An exception is an event that interrupts the normal flow of program execution.
Example:
number = 10 result = number / 0 print(result)
Output:
ZeroDivisionError
Python stops normal execution because division by zero is not allowed.
Q2. Difference between Error and Exception?
Error
Usually represents serious problems that applications cannot recover from.
Examples:
MemoryError SystemError
Exception
A condition that applications can handle.
Examples:
ValueError FileNotFoundError ConnectionError
Q3. Explain try, except, else, finally.
Example:
try: result = 10 / 2 except ZeroDivisionError: print("Cannot divide") else: print("Success") finally: print("Always executes")
Flow:
try | Success | else | finally
Failure:
try | except | finally
Q4. Does finally always execute?
Most of the time yes.
Example:
try: file=open("data.txt") finally: file.close()
The cleanup code runs even when an exception occurs.
When finally DOES NOT execute
Important interview question.
Case 1: Forceful Program Termination
Example:
import os try: print("Running") finally: print("Cleanup") os._exit(0)
Output:
Running
Finally does not execute because the process terminates immediately.
Case 2: System Shutdown
Example situations:
- Machine power failure
- Operating system crash
- Container killed forcefully
Python cannot execute cleanup code.
Case 3: Infinite Execution
Example:
try: while True: pass finally: print("Cleanup")
Program never reaches termination.
Q5. Difference between raise and raise e?
Example:
try: 10/0 except Exception as e: raise e
This restarts the exception.
Better:
except Exception: raise
Why?
Because:
raise
preserves the original traceback.
Q6. What is Exception Hierarchy?
Python exceptions follow inheritance.
Example:
BaseException | Exception | RuntimeError | ValueError | TypeError
Because of inheritance:
except Exception:
can catch many errors.
Q7. Why should we avoid bare except?
Bad:
try: code() except: pass
Problems:
- Hides bugs
- Removes debugging information
- Makes production troubleshooting difficult
Better:
except ValueError: handle_error()
Section 2: Intermediate Interview Questions
Q8. How do you create custom exceptions?
Example:
class PaymentError(Exception): pass
Usage:
raise PaymentError( "Payment failed" )
Used in:
- Banking systems
- APIs
- AI applications
- Enterprise software
Q9. What is exception chaining?
Example:
try: database.connect() except Exception as e: raise ApplicationError( "Database unavailable" ) from e
Output:
ApplicationError caused by Database Exception
Benefits:
- Keeps original cause
- Improves debugging
- Helps production support
Q10. Difference between logging and print?
print()
Used for:
- Learning
- Temporary debugging
logging()
Used for:
- Production systems
- Monitoring
- Auditing
Example:
import logging try: process() except Exception: logging.exception( "Processing failed" )
Q11. How do you handle multiple exceptions?
Example:
try: value=int(input()) except ValueError: print("Invalid number") except TypeError: print("Wrong type")
Q12. Can we have multiple except blocks?
Yes.
Example:
try: connect_database() except TimeoutError: retry() except ConnectionError: alert_team()
Section 3: Real Production Scenarios
Scenario 1: Production API is Down
Situation:
Users report:
Application not responding
Investigation:
API Server | Database Connection Failed
Bad handling:
database.connect()
Application crashes.
Professional handling:
try: database.connect() except ConnectionError: logging.exception( "Database unavailable" ) return { "message": "Service temporarily unavailable" }
Scenario 2: AI Chatbot Failure
Architecture:
User | FastAPI | LLM API | Vector Database
Failure:
LLM Timeout
Solution:
try: response = llm.generate( prompt ) except TimeoutError: retry_request() except Exception: fallback_model()
Scenario 3: Kubernetes Deployment Failure
Pipeline:
Git | CI/CD | Docker | Kubernetes
Failure:
Pod CrashLoopBackOff
Handling:
try: deploy() except Exception: rollback() send_alert()
Scenario 4: Payment Transaction Failure
Bad:
Debit Money Failure No rollback
Good:
try: debit_account() credit_account() except Exception: rollback()
Section 4: Advanced Interview Questions
Q13. What happens if an exception occurs inside finally?
Example:
try: print("Try") finally: 10/0
The finally exception replaces the original exception.
Q14. Can finally return a value?
Example:
def test(): try: return 10 finally: return 20
Output:
20
Important:
Avoid return statements inside finally.
They hide exceptions.
Q15. Difference between Exception and BaseException?
BaseException includes:
SystemExit KeyboardInterrupt GeneratorExit
Exception includes application errors.
Normally catch:
except Exception:
not:
except BaseException:
Q16. How do you debug production exceptions?
Professional approach:
- Check logs
- Identify timestamp
- Read stack trace
- Find root cause
- Reproduce issue
- Apply fix
- Add monitoring
Production Debugging Flow
Alert | Logs | Traceback | Root Cause | Fix | Prevent Future Failure
Section 5: Coding Interview Exercises
Exercise 1
What is the output?
try: print(10/0) except Exception: print("Error") finally: print("Done")
Answer:
Error Done
Exercise 2
Find the problem:
try: open("file.txt") except: pass
Answer:
Problem:
- Hides errors
- No logging
- Difficult debugging
Exercise 3
Improve this code:
try: connect() except: print("Failed")
Better:
try: connect() except ConnectionError: logging.exception( "Connection failed" )
Section 6: Career Mapping
Exception handling is required for:
Python Developer
Skills:
- Functions
- Classes
- APIs
- Databases
AI Engineer
Skills:
- LLM errors
- RAG failures
- Model fallback
- API reliability
Cloud Engineer
Skills:
- AWS exceptions
- Azure failures
- Cloud automation
DevOps Engineer
Skills:
- CI/CD failures
- Deployment rollback
- Monitoring
SRE Engineer
Skills:
- Incident response
- Reliability engineering
- Observability
How Eduarn Helps Build These Skills
Professional training programs combine:
Python Full Stack Development
Learn:
- Python
- Django
- Flask
- FastAPI
- Database integration
- API development
AI & Generative AI
Learn:
- Python for AI
- LLM applications
- RAG systems
- AI agents
- Production AI deployment
Cloud & DevOps
Learn:
- AWS
- Azure
- Google Cloud
- Docker
- Kubernetes
- CI/CD
- Infrastructure automation
Corporate Training
Organizations can train teams through:
- Real-time projects
- Hands-on labs
- Customized curriculum
- Cloud environments
- Interview preparation
Final Chapter Summary
You learned:
✅ Python exception interview concepts
✅ Exception hierarchy
✅ finally behavior
✅ Production debugging
✅ AI failure scenarios
✅ Cloud failure scenarios
✅ DevOps reliability patterns
✅ Senior-level troubleshooting approaches
Next Chapter:
Python Exception Handling Capstone Project
We will build a complete enterprise project:
AI-powered Customer Support System
Architecture:
React Frontend | FastAPI Backend | Authentication | LLM Service | RAG Pipeline | Vector Database | Cloud Deployment | Monitoring System
Including:
- Custom exceptions
- Logging
- Retry mechanism
- API error handling
- Database transactions
- Docker deployment
- Kubernetes monitoring
- Production best practices.
Python Exception Handling Masterclass
Chapter 12: Enterprise Capstone Project
Building an AI-Powered Customer Support System with Python Exception Handling
From Development to Production: AI + Cloud + DevOps + SRE Implementation
Project Overview
In this capstone project, we will design a real-world enterprise application:
AI Customer Support Assistant
A system that can:
- Answer customer questions using AI.
- Search company documents using RAG.
- Store conversations.
- Authenticate users.
- Handle failures gracefully.
- Monitor production health.
- Deploy on cloud infrastructure.
Real-World Architecture
Customer | Web Application React / Angular / Mobile | API Gateway | FastAPI Backend | -------------------------------- | | | Authentication AI Engine Database | | | JWT/OAuth LLM + RAG PostgreSQL | Vector Database | Cloud Platform AWS / Azure / GCP | Monitoring & Alerts Prometheus / Grafana / Logs
Technology Stack
Frontend
- React
- Angular
- Mobile Applications
Backend
Python:
- FastAPI
- Pydantic
- SQLAlchemy
AI Layer
- OpenAI APIs
- Azure OpenAI
- LLM Models
- Embeddings
- RAG Pipeline
Database
- PostgreSQL
- Redis Cache
Cloud
- AWS
- Microsoft Azure
- Google Cloud
DevOps
- Docker
- Kubernetes
- CI/CD
Chapter Goals
By the end of this project, you will learn:
✅ Enterprise exception architecture
✅ AI API failure handling
✅ Database error recovery
✅ Authentication exceptions
✅ Logging system design
✅ Retry mechanisms
✅ Cloud deployment errors
✅ Monitoring and alerting
Step 1: Project Structure
Professional Python project:
ai-support-system/ │ ├── app/ │ │ ├── main.py │ | │ ├── api/ │ │ │ │ └── chat.py │ | │ ├── services/ │ │ │ │ ├── ai_service.py │ │ ├── database.py │ │ │ ├── exceptions/ │ │ │ │ └── custom_errors.py │ | │ ├── middleware/ │ │ │ │ └── error_handler.py │ ├── logs/ │ ├── Dockerfile │ ├── requirements.txt │ └── README.md
Step 2: Creating Custom Exceptions
Professional applications avoid generic errors.
Create:
exceptions/custom_errors.py
Code:
class ApplicationError(Exception): """ Base application exception """ pass class AIServiceError(ApplicationError): pass class DatabaseError(ApplicationError): pass class AuthenticationError(ApplicationError): pass
Why Custom Exceptions?
Without:
raise Exception( "AI failed" )
Problem:
- Hard to identify source.
- Difficult monitoring.
- Poor debugging.
With:
raise AIServiceError( "Model unavailable" )
Now systems know:
Error Type: AI Failure
Step 3: Global Exception Handler
Instead of handling errors everywhere:
Create centralized handling.
File:
middleware/error_handler.py
Example:
from fastapi.responses import JSONResponse from app.exceptions.custom_errors import * async def global_exception_handler( request, exc ): if isinstance( exc, AIServiceError ): return JSONResponse( status_code=503, content={ "error": "AI service unavailable" } ) if isinstance( exc, DatabaseError ): return JSONResponse( status_code=500, content={ "error": "Database problem" } ) return JSONResponse( status_code=500, content={ "error": "Internal server error" } )
Step 4: AI Service Exception Handling
AI systems have unique failures:
Examples:
- Model unavailable
- Token limit exceeded
- API timeout
- Rate limit exceeded
AI Service:
services/ai_service.py
Example:
from app.exceptions.custom_errors import AIServiceError def generate_answer(prompt): try: response = call_llm( prompt ) return response except TimeoutError: raise AIServiceError( "AI model timeout" ) except Exception as e: raise AIServiceError( "AI processing failed" ) from e
Why Exception Chaining?
This:
raise AIServiceError( "Failed" ) from e
keeps:
Business Error + Original Technical Error
Useful for debugging.
Step 5: RAG Pipeline Error Handling
Architecture:
User Question | Embedding Model | Vector Search | Retrieved Documents | LLM Response
Possible failures:
Embedding Failure
try: create_embedding() except Exception: raise AIServiceError( "Embedding failed" )
Vector Database Failure
try: search_documents() except Exception: raise DatabaseError( "Vector database unavailable" )
Step 6: Database Exception Handling
Example:
from sqlalchemy.exc import SQLAlchemyError def save_chat(message): try: database.save( message ) except SQLAlchemyError as e: raise DatabaseError( "Unable to save chat" ) from e
Transaction Handling
Customer support conversation:
Save User Message + Generate AI Response + Save AI Response
If failure:
Rollback.
Example:
try: save_user_message() generate_response() save_ai_message() except Exception: rollback() raise
Step 7: API Layer Exception Handling
FastAPI Endpoint:
from fastapi import APIRouter router = APIRouter() @router.post("/chat") def chat(message:str): answer = generate_answer( message ) return { "response": answer }
Failure:
AI Service Down
Handled automatically:
Global Exception Handler | HTTP 503 Response
Step 8: Authentication Exception Handling
Login flow:
User | Validate Token | Access API
Example:
def verify_token(token): try: validate(token) except Exception: raise AuthenticationError( "Invalid token" )
Step 9: Logging System
Production systems need logs.
Example:
import logging logger=logging.getLogger() try: process_chat() except Exception: logger.exception( "Chat processing failed" ) raise
Logs contain:
Time Error Type Stack Trace User Request ID Service Name
Step 10: Retry Mechanism
Temporary failures should retry.
Example:
import time for attempt in range(3): try: call_ai_service() break except TimeoutError: time.sleep( 2 ** attempt )
Retry timeline:
Attempt 1 Wait 1 second Attempt 2 Wait 2 seconds Attempt 3 Wait 4 seconds
Step 11: Docker Deployment Error Handling
Dockerfile:
FROM python:3.12 WORKDIR /app COPY . RUN pip install -r requirements.txt CMD [ "python", "main.py" ]
Possible failures:
- Dependency issue
- Environment variable missing
- Port conflict
Python startup validation:
import os if not os.getenv( "API_KEY" ): raise EnvironmentError( "Missing API Key" )
Step 12: Kubernetes Production Handling
Deployment:
Docker Container | Kubernetes Pod | Service | Users
Health Check:
@app.get("/health") def health(): return { "status": "running" }
Kubernetes checks:
Healthy | Continue Traffic Failed | Restart Container
Step 13: Monitoring Architecture
Production:
Application | Logs | Metrics | Alerts | Engineer
Monitor:
- API failures
- AI latency
- Database errors
- Memory usage
- CPU usage
Final Enterprise Error Flow
User Request | API | Validation | Business Logic | Exception Layer | Logging | Monitoring | Recovery | Response
Skills Developed From This Project
After completing this project you can demonstrate:
Python Development
- Exception architecture
- Backend APIs
- Database handling
AI Engineering
- LLM integration
- RAG systems
- AI reliability
Cloud Engineering
- Deployment
- Monitoring
- Scalability
DevOps
- Docker
- Kubernetes
- CI/CD
SRE
- Reliability
- Incident handling
- Observability
How Eduarn Helps You Build These Industry Skills
Through practical programs:
AI & Generative AI Training
You learn:
- Python for AI
- LLM applications
- Prompt engineering
- RAG architecture
- AI agents
- Production AI systems
Cloud & DevOps Training
You learn:
- AWS
- Azure
- Google Cloud
- Docker
- Kubernetes
- CI/CD pipelines
- Infrastructure automation
Python Full Stack Development
You learn:
- Python programming
- Django
- Flask
- FastAPI
- Database development
- Enterprise APIs
Corporate Training
Eduarn helps organizations with:
- Customized learning paths
- Hands-on labs
- Real-world projects
- Team skill development
- Interview and career preparation
Next Chapter:
Chapter 13: Python Exception Handling for AI Engineering
Next we will cover:
- AI model failures
- LLM API exception handling
- RAG pipeline errors
- Vector database failures
- Prompt validation
- AI agent error recovery
- MLOps monitoring
- Production AI reliability patterns.
Python Exception Handling Masterclass
Chapter 13: Python Exception Handling for AI Engineering
Building Reliable AI Applications, LLM Systems, RAG Pipelines & AI Agents
Introduction
Artificial Intelligence applications are different from traditional software applications.
A normal application may fail because:
- Database is unavailable
- API is down
- Invalid user input
AI applications introduce additional failure points:
User | AI Application | Prompt Processing | Embedding Model | Vector Database | LLM Model | Cloud API | Response Generation
Every layer can fail.
A production AI engineer must design systems that can:
✅ Detect failures
✅ Recover automatically
✅ Provide meaningful feedback
✅ Monitor AI quality
✅ Maintain reliability at scale
Learning Objectives
After completing this chapter, you will understand:
- AI-specific exception handling.
- LLM API failure management.
- Prompt validation errors.
- Token limit handling.
- RAG pipeline exceptions.
- Vector database failures.
- AI agent error recovery.
- MLOps monitoring.
- Production AI reliability patterns.
1. Why Exception Handling is Critical in AI Systems
Traditional application:
Input | Logic | Output
AI application:
Input | Prompt Engineering | Embedding | Retrieval | LLM Processing | Validation | Response | Monitoring
More components mean more possible failures.
Common AI Application Failures
| Failure | Example |
|---|---|
| Prompt Error | Empty question |
| Token Error | Input too large |
| Model Error | Model unavailable |
| API Error | Rate limit exceeded |
| Retrieval Error | Vector DB unavailable |
| Hallucination | Incorrect AI answer |
| Timeout | Slow response |
| Security Error | Unsafe input |
2. Creating AI-Specific Exception Classes
Professional AI applications create custom exceptions.
Example:
class AIApplicationError(Exception): pass class ModelError(AIApplicationError): pass class PromptError(AIApplicationError): pass class TokenLimitError(AIApplicationError): pass class RetrievalError(AIApplicationError): pass
Why Custom AI Exceptions?
Instead of:
raise Exception( "Something failed" )
Use:
raise ModelError( "LLM service unavailable" )
Now monitoring systems understand:
Error Category: AI Model Failure
3. Prompt Validation Exception Handling
Users can send:
(empty message) or extremely long input or unsafe content
Example:
def validate_prompt(prompt): if not prompt: raise PromptError( "Prompt cannot be empty" ) if len(prompt) > 5000: raise TokenLimitError( "Prompt too large" )
4. Handling LLM API Failures
AI applications often communicate with:
- OpenAI APIs
- Azure OpenAI
- Google Vertex AI
- AWS Bedrock
- Hugging Face APIs
Possible failures:
Authentication Failure Rate Limit Timeout Server Error Invalid Request
Example:
def generate_response(prompt): try: response = llm.generate( prompt ) return response except TimeoutError: raise ModelError( "AI response timeout" ) except Exception as e: raise ModelError( "Model execution failed" ) from e
5. Handling Token Limit Errors
Large language models have limits.
Example:
Prompt Tokens + Response Tokens = Total Context
If limit exceeds:
TokenLimitError
Example:
def check_tokens(text): tokens = count_tokens(text) if tokens > 8000: raise TokenLimitError( "Reduce input size" )
6. Retry Mechanism for AI APIs
AI APIs can fail temporarily.
Example:
Request | Timeout | Retry | Success
Implementation:
import time def call_ai(): for attempt in range(3): try: return model.generate() except TimeoutError: time.sleep( 2 ** attempt )
Retry strategy:
Attempt 1 Wait 1 second Attempt 2 Wait 2 seconds Attempt 3 Wait 4 seconds
7. RAG Pipeline Exception Handling
Retrieval Augmented Generation:
User Question | Embedding Model | Vector Search | Relevant Documents | LLM | Answer
Failures:
Embedding Failure
try: embedding=create_embedding( question ) except Exception: raise RetrievalError( "Embedding failed" )
Vector Database Failure
Example:
try: documents = vector_db.search( query ) except Exception: raise RetrievalError( "Search unavailable" )
8. Handling Hallucination Risk
AI may generate incorrect answers.
Example:
User:
What is company policy?
AI:
Invented policy
Solution:
Add validation:
def validate_answer(answer): if not answer: raise AIApplicationError( "Empty response" )
Enterprise approach:
Question | Retrieve Documents | Generate Answer | Fact Check | Return Response
9. AI Agent Exception Handling
AI Agents:
Agent | Planning | Tool Calling | API Execution | Final Answer
Failures:
- Tool unavailable
- Wrong parameters
- API failure
- Infinite loop
Example:
def execute_agent(task): try: result = agent.run( task ) return result except Exception: fallback_agent()
10. Tool Calling Error Handling
AI Agent:
AI | Weather Tool | Database Tool | Search Tool
Example:
def call_tool(tool): try: return tool.execute() except ConnectionError: return { "error": "Tool unavailable" }
11. AI Security Exception Handling
AI systems must handle:
- Prompt injection
- Data leakage
- Unauthorized requests
Example:
def check_input(prompt): if "ignore rules" in prompt: raise PromptError( "Unsafe prompt" )
12. Database Handling in AI Applications
AI applications store:
- Chat history
- User profiles
- Embeddings
- Documents
Example:
try: save_conversation() except Exception: rollback() raise DatabaseError( "Unable to save chat" )
13. AI Monitoring and Logging
Production AI requires:
Logs
Example:
Prompt Failed Model Timeout User ID Request ID
Metrics
Track:
- Response time
- Token usage
- Error percentage
- Model latency
Tracing
Follow:
User Request | API | Embedding | Vector Search | LLM | Response
14. Production AI Architecture
User | Frontend | FastAPI API | Exception Middleware | --------------------- | | | LLM RAG Database | | | Monitor Logs Metrics | Alert System
15. AI Fallback Strategies
Professional AI systems avoid complete failure.
Example:
Primary model:
GPT-5
Failure:
Fallback Model
Example:
try: answer = premium_model() except ModelError: answer = backup_model()
16. MLOps Exception Handling
Machine Learning lifecycle:
Data | Training | Validation | Deployment | Monitoring
Failures:
- Bad dataset
- Training failure
- Model drift
- Deployment error
Example:
try: train_model() except Exception: send_alert( "Training failed" )
17. AI Production Best Practices
✅ Validate every user input.
✅ Create AI-specific exceptions.
✅ Implement retries.
✅ Use fallback models.
✅ Monitor token usage.
✅ Track AI latency.
✅ Log failures securely.
✅ Protect sensitive data.
✅ Test failure scenarios.
✅ Monitor model quality.
Career Relevance
These skills are required for:
AI Engineer
- LLM applications
- RAG systems
- AI agents
Generative AI Developer
- Prompt systems
- AI APIs
- Automation
MLOps Engineer
- Model deployment
- Monitoring
Cloud AI Engineer
- Azure AI
- AWS AI Services
- Google AI Platform
How Eduarn Helps You Build AI Engineering Skills
Through practical programs:
AI & Generative AI Training
Learn:
- Python for AI
- Machine Learning basics
- LLM applications
- Prompt Engineering
- RAG Architecture
- AI Agents
- Production AI deployment
Cloud Training
Learn:
- AWS AI Services
- Azure OpenAI
- Google Cloud AI
- Cloud deployment patterns
DevOps & MLOps Training
Learn:
- Docker
- Kubernetes
- CI/CD
- Model deployment
- Monitoring
- Automation
Corporate Training
Organizations can build teams through:
- AI transformation programs
- Hands-on labs
- Real-time projects
- Customized learning paths
Chapter Summary
You learned:
✅ AI exception architecture
✅ LLM API error handling
✅ Prompt validation
✅ Token management
✅ RAG failure handling
✅ AI Agent recovery
✅ MLOps reliability
✅ Production AI design patterns
Next Chapter:
Chapter 14: Python Exception Handling for SRE & Production Reliability
Next topics:
- SRE error budgets
- AI system reliability
- Observability architecture
- Incident response
- Root Cause Analysis (RCA)
- Chaos engineering
- Production debugging
- Reliability automation with Python
- Building self-healing systems
Python Exception Handling Masterclass
Chapter 14: Python Exception Handling for SRE & Production Reliability
Building Highly Available Systems, Monitoring Failures & Self-Healing Applications
Introduction
Software failures are unavoidable.
Even the best-designed systems experience:
- Application crashes
- Database failures
- Network problems
- Cloud outages
- Security incidents
- Performance degradation
The goal of Site Reliability Engineering (SRE) is not to prevent every failure.
The goal is:
Build systems that detect failures quickly, recover automatically, and continuously improve reliability.
Python exception handling plays a critical role in SRE because many reliability tools, automation scripts, monitoring systems, and recovery processes are built using Python.
Learning Objectives
After completing this chapter, you will understand:
✅ SRE principles and exception handling
✅ Reliability engineering concepts
✅ Error budgets and SLIs/SLOs
✅ Production monitoring
✅ Incident management
✅ Root Cause Analysis (RCA)
✅ Self-healing automation using Python
✅ Chaos engineering concepts
✅ Building reliable production systems
1. What is SRE?
Site Reliability Engineering combines:
Software Engineering + Operations + Automation + Reliability
Traditional operations:
Problem Happens | Engineer Fixes Manually
SRE approach:
Problem Happens | System Detects | Automation Responds | Engineer Improves System
2. Why Exception Handling Matters in SRE
A production application:
Users | Load Balancer | Application Servers | Database | External Services
Every component can fail.
Without exception handling:
Failure | Application Crash | Users Impacted
With proper exception handling:
Failure | Detect Exception | Log Error | Recover | Alert Team
3. SRE Reliability Model
SRE focuses on:
Availability
Is the system working?
Example:
99.9% uptime
Reliability
Does it behave consistently?
Example:
API responds correctly
Scalability
Can it handle growth?
Example:
100 users to 1 million users
Recovery
How quickly can it recover?
Example:
Failure at 10:00 Recovered at 10:05
4. SLI, SLO and SLA
SLI (Service Level Indicator)
Measurement.
Example:
API Response Time Database Availability Error Rate
SLO (Service Level Objective)
Target.
Example:
99.9% API Availability
SLA (Service Level Agreement)
Business commitment.
Example:
Customer receives compensation if uptime falls below agreement.
5. Error Budget Concept
SRE accepts that some failures happen.
Example:
SLO:
99.9% uptime
Allowed downtime:
43 minutes/month
This is the error budget.
Usage:
Large Error Budget | More Feature Releases Small Error Budget | Focus on Reliability
6. Production Exception Flow
Enterprise system:
User Request | Application | Exception Occurs | Exception Handler | Logging System | Monitoring | Alert | Engineer | Fix
7. Production Logging with Python
Poor:
print( "Error" )
Problem:
- No timestamp
- No severity
- Difficult searching
Professional:
import logging logging.basicConfig( level=logging.INFO ) try: process_request() except Exception: logging.exception( "Request failed" )
Output:
2026-08-02 ERROR Request failed Traceback details
8. Exception Monitoring
Production systems use:
- Prometheus
- Grafana
- ELK Stack
- Datadog
- Splunk
- CloudWatch
- Azure Monitor
Example:
Application:
try: payment_process() except Exception: send_metric( "payment_failure" )
Dashboard:
Payment Errors ██████████ 20% API Latency ██████ 200ms
9. Alert Engineering
Bad alert:
Every small error sends notification
Result:
Alert fatigue.
Good alert:
Critical Error + User Impact + Action Required
Example:
if error_rate > 5: send_alert( "High API Failure Rate" )
10. Incident Management
Production incident lifecycle:
Detection | Alert | Response | Investigation | Recovery | RCA | Prevention
Example:
Incident:
Website Down
Investigation:
Application Error | Database Connection Failed | Expired Credentials
Solution:
Automated Secret Rotation
11. Root Cause Analysis (RCA)
RCA finds the actual reason behind failure.
Example:
Problem:
API unavailable
Wrong answer:
Server crashed
Real root cause:
Memory leak caused server crash
5 Why Analysis
Problem:
Website Down
Why?
↓
Database unavailable
Why?
↓
Connection limit exceeded
Why?
↓
Connection pool misconfigured
Why?
↓
No performance testing
Why?
↓
Missing capacity planning
12. Python Self-Healing Automation
Self-healing means:
System detects and fixes problems automatically.
Example:
Service Down | Python Monitor | Restart Service | Verify Health
Python example:
import subprocess def restart_service(): try: subprocess.run( [ "systemctl", "restart", "app" ], check=True ) print( "Service restarted" ) except Exception as e: print( "Recovery failed", e )
13. Health Check Automation
Application health endpoint:
@app.get("/health") def health(): return { "status": "healthy" }
Monitoring script:
import requests try: response=requests.get( "http://app/health" ) if response.status_code != 200: restart_service() except Exception: restart_service()
14. Kubernetes Self-Healing
Kubernetes provides:
- Restart failed containers
- Replace unhealthy pods
- Scale applications
Flow:
Application Failure | Kubernetes Detects | Restart Container | Restore Service
Python can monitor:
try: check_pods() except Exception: trigger_recovery()
15. Chaos Engineering
Chaos engineering intentionally creates failures.
Purpose:
Find weaknesses before customers do.
Examples:
- Kill containers
- Stop servers
- Increase latency
- Disconnect networks
Example:
Production System + Controlled Failure | Observe Recovery
16. AI System Reliability in SRE
AI systems require additional monitoring.
Monitor:
Model Latency
Example:
Response Time: 500ms → 5 seconds
Token Usage
Example:
Daily Token Cost Increased
Model Errors
Example:
API Timeout Rate Limit
AI Quality
Example:
Wrong Answers Increasing
17. AI Self-Healing Example
try: answer = primary_model.generate( prompt ) except Exception: answer = backup_model.generate( prompt )
Architecture:
User | Primary AI Model | Failure | Fallback Model | Response
18. Production Exception Handling Rules
Rule 1
Never hide exceptions.
Bad:
except: pass
Rule 2
Always log production errors.
Good:
logging.exception( "Failure" )
Rule 3
Recover when possible.
Example:
Retry Fallback Rollback
Rule 4
Protect sensitive data.
Never log:
Password API Key Customer Data
19. SRE Interview Questions
Q1. What is the difference between monitoring and observability?
Answer:
Monitoring tells:
What is failing?
Observability helps understand:
Why is it failing?
Q2. What is an error budget?
Answer:
Allowed failure amount within an SLO.
Q3. How do you handle production exceptions?
Answer:
- Capture logs
- Alert
- Investigate
- Recover
- Perform RCA
- Prevent recurrence
Q4. What is self-healing?
Answer:
Automatic detection and recovery without manual intervention.
20. Career Applications
SRE exception handling skills are required for:
SRE Engineer
Skills:
- Reliability
- Monitoring
- Incident management
DevOps Engineer
Skills:
- Automation
- CI/CD
- Kubernetes
Cloud Engineer
Skills:
- AWS
- Azure
- GCP
AI Engineer
Skills:
- AI monitoring
- Model reliability
- Production deployment
How Eduarn Helps Build SRE + AI + Cloud Skills
Eduarn programs help learners build industry-ready skills through practical learning.
AI & Generative AI
Learn:
- Python AI development
- LLM applications
- RAG systems
- AI agents
- AI deployment
Cloud & DevOps
Learn:
- AWS
- Azure
- Google Cloud
- Docker
- Kubernetes
- CI/CD
- Monitoring
Python Full Stack
Learn:
- Python
- Django
- Flask
- FastAPI
- APIs
- Database systems
Corporate Training
Organizations can develop teams with:
- Customized SRE programs
- Cloud labs
- AI workshops
- DevOps automation training
- Real-world projects
Chapter Summary
You learned:
✅ SRE principles
✅ Production exception management
✅ Monitoring and alerting
✅ Incident response
✅ Root Cause Analysis
✅ Self-healing automation
✅ Chaos engineering
✅ AI reliability practices
Next Chapter:
Chapter 15: Python Exception Handling Best Practices & Enterprise Design Patterns
Next topics:
- Exception architecture for large applications
- Clean code principles
- Anti-patterns to avoid
- Enterprise logging design
- Error response standards
- Security best practices
- Designing reusable exception frameworks
- Final Python Exception Handling Certification Project.
Python Exception Handling Masterclass
Chapter 15: Enterprise Exception Handling Design Patterns & Best Practices
Writing Clean, Scalable, Secure and Production-Ready Python Applications
Introduction
In small Python scripts, exception handling may look simple:
try: operation() except Exception: print("Error")
But enterprise applications are different.
A production system may have:
User Request | API Gateway | Authentication Layer | Business Logic | Database Layer | External APIs | AI Services | Cloud Infrastructure
Each layer can fail differently.
A professional developer must design an exception handling strategy that is:
✅ Maintainable
✅ Debuggable
✅ Secure
✅ Scalable
✅ Easy to monitor
Learning Objectives
After this chapter, you will understand:
- Enterprise exception architecture
- Layer-based error handling
- Clean code practices
- Exception anti-patterns
- API error standards
- Security considerations
- Logging architecture
- Reusable error frameworks
1. Enterprise Exception Handling Architecture
A mature application separates errors into layers.
Example:
Application | ├── Presentation Errors | ├── Business Errors | ├── Database Errors | ├── Integration Errors | ├── AI Service Errors | └── Infrastructure Errors
2. Layer-Based Exception Design
Layer 1: API / Controller Layer
Responsible for:
- Receiving requests
- Validating input
- Returning responses
Example:
@app.post("/users") def create_user(data): try: return user_service.create(data) except ValidationError as e: return { "error": str(e) }
Layer 2: Service Layer
Contains business rules.
Example:
def create_order(order): if order.amount <= 0: raise BusinessError( "Invalid amount" ) save_order(order)
Layer 3: Database Layer
Handles storage problems.
Example:
def save_user(user): try: database.insert(user) except DatabaseError: raise DataAccessError( "Unable to save user" )
3. Exception Inheritance Design
Professional applications create a base exception.
Example:
class ApplicationException(Exception): def __init__( self, message, code ): self.message = message self.code = code class ValidationException( ApplicationException ): pass class DatabaseException( ApplicationException ): pass class AIException( ApplicationException ): pass
Usage:
raise AIException( "Model unavailable", "AI_001" )
4. Standard Error Response Format
Enterprise APIs should return consistent responses.
Bad:
{ "error":"failed" }
Professional:
{ "status":"error", "error":{ "code":"USER_001", "message":"Invalid email", "timestamp":"2026-08-02", "request_id":"abc123" } }
Benefits:
- Easier debugging
- Better frontend integration
- Better monitoring
5. Global Exception Handler Pattern
Instead of writing:
try: function() except: handle()
everywhere.
Use centralized handling.
Architecture:
Application | Exception Middleware | Error Formatter | Logging | Response
Example:
@app.exception_handler( ApplicationException ) async def handler( request, exc ): return { "error": exc.message, "code": exc.code }
6. Exception Anti-Patterns
Anti Pattern 1: Catch Everything
Bad:
try: process() except Exception: print( "Failed" )
Problem:
- Hides real issue
- Difficult debugging
Better:
except DatabaseException: recover_database()
Anti Pattern 2: Empty Exception Block
Bad:
try: connect() except Exception: pass
Why dangerous?
The system fails silently.
Anti Pattern 3: Too Much Logic Inside Except
Bad:
try: process() except Exception: send_email() update_database() restart_server() create_ticket()
Problem:
Exception handling becomes complex.
Better:
except Exception: recovery_service.handle()
Anti Pattern 4: Returning Sensitive Information
Bad:
return { "error": "Database password incorrect" }
Security risk.
Better:
return { "error": "Database connection failed" }
7. Logging Best Practices
Production logging should include:
Timestamp
2026-08-02 10:30
Service Name
Payment-Service
Request ID
REQ-12345
Error Type
DatabaseException
Example:
import logging logger=logging.getLogger( "payment" ) try: process_payment() except Exception: logger.exception( "Payment failed" )
8. Exception Handling in Microservices
Modern systems:
User Service | Payment Service | Notification Service | AI Service
Each service has:
- Own exceptions
- Own logs
- Own monitoring
Example:
Payment Service:
class PaymentFailed(Exception): pass
AI Service:
class ModelUnavailable(Exception): pass
9. Exception Handling in FastAPI Applications
Example:
from fastapi import HTTPException @app.get("/customer") def customer(id:int): user=find_user(id) if not user: raise HTTPException( status_code=404, detail="User not found" ) return user
10. Exception Handling in AI Applications
AI pipeline:
User Input | Prompt Validation | Embedding | Vector Search | LLM | Response
Example:
try: answer = generate_answer() except TokenLimitError: summarize_prompt() except ModelError: use_backup_model()
11. Exception Handling in Cloud Applications
Cloud failures:
- Network timeout
- Service unavailable
- Permission denied
- Resource limit
Example:
try: upload_file() except TimeoutError: retry_upload() except PermissionError: request_access()
12. Exception Handling in DevOps Automation
CI/CD pipeline:
Developer | Git Push | Build | Test | Deploy | Production
Python automation:
try: deploy_application() except Exception: rollback() notify_team()
13. Exception Handling and Security
Never expose:
❌ Passwords
❌ API keys
❌ Database credentials
❌ Customer information
Bad:
except Exception as e: return str(e)
Good:
except Exception: return { "message": "Internal server error" }
14. Exception Handling Testing
Professional developers test failures.
Example:
def test_database_failure(): mock_database_failure() result=create_user() assert result=="error"
Test scenarios:
- API failure
- Database failure
- Timeout
- Invalid input
- Authentication failure
15. Enterprise Exception Checklist
Before production release:
✅ Custom exceptions created
✅ Error codes defined
✅ Logging implemented
✅ Sensitive data protected
✅ Monitoring configured
✅ Retry strategy added
✅ Recovery tested
✅ Documentation created
16. Interview Questions
Q1. Why create custom exceptions?
Answer:
Custom exceptions provide:
- Better readability
- Better debugging
- Better monitoring
- Better error classification
Q2. Where should exceptions be handled?
Answer:
Handle exceptions at the layer where recovery is possible.
Example:
Database layer:
Connection retry
API layer:
HTTP response
Q3. Why not catch Exception everywhere?
Answer:
Because it hides unexpected errors and makes debugging difficult.
Q4. Difference between logging and exception handling?
Answer:
Exception handling manages failures.
Logging records information about failures.
Both work together.
17. Career Relevance
Enterprise exception handling is required for:
Python Developer
- Backend systems
- APIs
- Applications
AI Engineer
- LLM reliability
- RAG pipelines
- AI agents
Cloud Engineer
- Cloud automation
- Infrastructure scripts
DevOps Engineer
- CI/CD automation
- Deployment recovery
SRE Engineer
- Monitoring
- Incident response
- Reliability engineering
How Eduarn Helps Learners Build These Skills
Eduarn focuses on practical industry skills through:
Python Full Stack Development
Learn:
- Python programming
- Backend development
- APIs
- Database systems
- Enterprise application design
AI & Generative AI
Learn:
- Python AI development
- LLM applications
- RAG systems
- AI agents
- Production AI engineering
Cloud & DevOps
Learn:
- AWS
- Azure
- Google Cloud
- Docker
- Kubernetes
- CI/CD
- Automation
Corporate Training
Companies can build engineering teams through:
- Customized programs
- Hands-on cloud labs
- Real-time projects
- Career-focused learning paths
Chapter Summary
You learned:
✅ Enterprise exception architecture
✅ Layer-based error handling
✅ Custom exception design
✅ API error standards
✅ Logging practices
✅ Security practices
✅ AI, Cloud and DevOps error handling
Next Chapter:
Chapter 16: Final Python Exception Handling Enterprise Project
We will build:
Production-Ready AI SaaS Application
Including:
- FastAPI backend
- Authentication
- AI integration
- RAG pipeline
- PostgreSQL
- Docker
- Kubernetes
- CI/CD
- Monitoring
- Exception framework
- Complete deployment architecture
This will connect Python + AI + Cloud + DevOps + SRE into one real-world project.
Python Exception Handling Masterclass
Chapter 16: Final Enterprise Project
Building a Production-Ready AI SaaS Application Using Python Exception Handling
Project: AI Customer Knowledge Assistant Platform
In this final project, we will combine everything learned:
- Python Exception Handling
- FastAPI Backend
- AI / LLM Integration
- RAG Architecture
- PostgreSQL Database
- Authentication
- Docker
- Kubernetes
- CI/CD
- Monitoring
- SRE Practices
This is the type of architecture used in modern AI-powered enterprise applications.
Project Goal
Build an AI SaaS platform where organizations can:
✅ Upload company documents
✅ Ask questions using AI
✅ Get intelligent answers
✅ Maintain chat history
✅ Manage users
✅ Monitor system health
✅ Deploy securely on cloud
1. Final Application Architecture
Users | Web Application React / Angular | API Gateway | FastAPI Backend | ------------------------------------------------ | | | Authentication AI Engine Database | | | JWT/OAuth LLM + RAG Pipeline PostgreSQL | Vector Database Pinecone / FAISS | Cloud Infrastructure AWS / Azure / Google Cloud | Monitoring System Prometheus + Grafana + Logs
2. Technology Stack
Backend
Python:
- FastAPI
- SQLAlchemy
- Pydantic
AI Layer
- LLM APIs
- Embedding Models
- RAG Pipeline
- AI Agents
Database
- PostgreSQL
- Redis
DevOps
- Docker
- Kubernetes
- GitHub Actions
- Jenkins
Monitoring
- Prometheus
- Grafana
- Cloud Monitoring
3. Professional Project Structure
ai-enterprise-platform/ │ ├── app/ │ │── main.py │ ├── api/ │ ├── auth.py │ ├── chat.py │ └── documents.py │ ├── services/ │ │ ├── ai_service.py │ ├── rag_service.py │ ├── user_service.py │ ├── database/ │ │ ├── connection.py │ └── models.py │ ├── exceptions/ │ │ ├── base.py │ ├── ai_errors.py │ └── database_errors.py │ ├── middleware/ │ │ └── exception_handler.py │ ├── monitoring/ │ │ └── metrics.py │ ├── Dockerfile │ ├── requirements.txt │ └── README.md
4. Exception Framework Design
Enterprise applications start with error architecture.
Base Exception
File:
exceptions/base.py
Code:
class ApplicationException(Exception): def __init__( self, message, error_code ): self.message = message self.error_code = error_code super().__init__(message)
5. AI Exceptions
File:
exceptions/ai_errors.py
Code:
from .base import ApplicationException class AIServiceError( ApplicationException ): pass class TokenLimitError( ApplicationException ): pass class ModelTimeoutError( ApplicationException ): pass
6. Database Exceptions
File:
exceptions/database_errors.py
Code:
from .base import ApplicationException class DatabaseConnectionError( ApplicationException ): pass class DataSaveError( ApplicationException ): pass
7. Global Exception Handler
Instead of handling errors everywhere:
Create one central system.
File:
middleware/exception_handler.py
Example:
from fastapi.responses import JSONResponse async def exception_handler( request, exc ): return JSONResponse( status_code=500, content={ "status":"error", "message": exc.message, "code": exc.error_code } )
8. User Authentication Module
Flow:
User | Login | Validate Credentials | Generate JWT Token | Access Application
Example:
def authenticate(username,password): try: user = find_user(username) if not user: raise Exception( "User not found" ) return generate_token(user) except Exception as e: raise AuthenticationError( "Login failed" ) from e
9. Document Upload System
Users upload:
- Word
- Text files
Flow:
Document | Extract Text | Create Embeddings | Store Vector | Ready for AI Search
Exception handling:
def upload_document(file): try: text = extract_text(file) store_embedding(text) except Exception as e: raise AIServiceError( "Document processing failed" ) from e
10. RAG Pipeline Implementation
Architecture:
Question | Embedding | Vector Search | Relevant Documents | LLM | Answer
Code:
def answer_question(question): try: documents = search_vector( question ) answer = generate_ai_response( documents, question ) return answer except Exception as e: raise AIServiceError( "Unable to generate answer" ) from e
11. AI Fallback Strategy
Production AI should not completely fail.
Example:
def generate_response(prompt): try: return primary_model( prompt ) except Exception: return backup_model( prompt )
Architecture:
User | Primary AI Model | Failure | Backup AI Model | Response
12. Database Transaction Handling
Example:
Saving conversation:
def save_chat(user,message): try: database.begin() database.save( message ) database.commit() except Exception: database.rollback() raise DataSaveError( "Unable to save chat" )
13. Logging Architecture
Production logs:
Application | Logger | Log Storage | Monitoring Dashboard
Example:
import logging logger=logging.getLogger( "ai-platform" ) try: process_request() except Exception: logger.exception( "Request failed" )
14. Docker Deployment
Dockerfile:
FROM python:3.12 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . CMD [ "uvicorn", "main:app" ]
Build:
docker build -t ai-platform .
Run:
docker run -p 8000:8000 ai-platform
15. Kubernetes Deployment
Architecture:
Docker Image | Kubernetes Pod | Service | Users
Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: ai-platform spec: replicas:3 template: spec: containers: - name: api image: ai-platform
16. Health Monitoring
Create:
/health
API:
@app.get("/health") def health(): return { "status": "healthy" }
Monitoring checks:
CPU Memory API Errors AI Latency Database Status
17. CI/CD Pipeline
Flow:
Developer | Git Push | Build | Test | Security Scan | Docker Build | Deploy | Production
Pipeline example:
steps: - build - test - docker - deploy
18. Production Failure Scenarios
Scenario 1
AI Model Down
Solution:
Fallback Model + Alert
Scenario 2
Database Failure
Solution:
Retry + Rollback + Recovery
Scenario 3
High Traffic
Solution:
Kubernetes Scaling
Scenario 4
Application Crash
Solution:
Container Restart
19. SRE Reliability Checklist
Before production:
✅ Exception framework ready
✅ Central logging enabled
✅ Monitoring configured
✅ Health checks created
✅ Backup strategy available
✅ Security validation complete
✅ Failure testing completed
20. Skills You Can Add to Resume
After completing this project:
Python Developer
Skills:
- Advanced Python
- Exception Architecture
- FastAPI
- Backend Systems
AI Engineer
Skills:
- LLM Applications
- RAG
- AI Agents
- AI Reliability
Cloud Engineer
Skills:
- AWS/Azure/GCP
- Docker
- Kubernetes
DevOps Engineer
Skills:
- CI/CD
- Automation
- Monitoring
SRE Engineer
Skills:
- Incident Handling
- Observability
- Reliability Engineering
How Eduarn Helps You Build These Industry Skills
Eduarn provides practical learning paths in:
AI & Generative AI
Learn:
- Python AI Development
- LLM Applications
- Prompt Engineering
- RAG Systems
- AI Agents
Cloud & DevOps
Learn:
- AWS
- Azure
- Google Cloud
- Docker
- Kubernetes
- CI/CD
Python Full Stack
Learn:
- Python
- FastAPI
- Django
- Databases
- Enterprise Application Development
Corporate Training
Organizations can train teams through:
- Customized AI programs
- Cloud labs
- DevOps workshops
- Real-time projects
- Skill transformation programs
Final Chapter Summary
You have now learned how to design:
✅ Enterprise Python exception frameworks
✅ AI application error handling
✅ Cloud-ready applications
✅ DevOps automation systems
✅ SRE production practices
Next Chapter:
Chapter 17: Python Exception Handling Interview Preparation
Topics:
- 100+ Python exception interview questions
- Real production scenarios
- AI Engineer interview questions
- Cloud & DevOps troubleshooting questions
- SRE incident-based questions
- Coding challenges with solutions
Python Exception Handling Masterclass
Chapter 17: Python Exception Handling Interview Preparation
100+ Interview Questions for Python Developer, AI Engineer, Cloud & DevOps Roles
Introduction
Exception handling is one of the most important topics in Python interviews because it reflects how developers design reliable applications.
Interviewers do not only ask:
"What is try and except?"
They want to understand:
- How you handle production failures
- How you debug applications
- How you design scalable systems
- How you handle AI, Cloud and DevOps failures
This chapter covers:
✅ Beginner Python interview questions
✅ Advanced Python exception questions
✅ AI Engineer scenarios
✅ Cloud & DevOps scenarios
✅ SRE troubleshooting questions
✅ Coding problems with solutions
Section 1: Beginner Python Exception Handling Questions
Q1. What is exception handling in Python?
Answer:
Exception handling is a mechanism to handle runtime errors without stopping program execution.
Example:
try: number = 10 / 0 except ZeroDivisionError: print( "Cannot divide by zero" )
Output:
Cannot divide by zero
Q2. Why do we need exception handling?
Answer:
Without exception handling:
x = 10 / 0
Program stops:
ZeroDivisionError
With exception handling:
- Application continues
- User gets meaningful message
- Error can be logged
- Recovery can happen
Q3. Difference between syntax error and exception?
Syntax Error
Problem in code structure.
Example:
print("Hello"
Error:
SyntaxError
Exception
Program is valid but fails during execution.
Example:
10 / 0
Error:
ZeroDivisionError
Q4. What are the keywords used in exception handling?
Python uses:
try except else finally raise
Example:
try: process() except Exception: handle() finally: cleanup()
Q5. Explain try block.
Answer:
The try block contains code that may generate an exception.
Example:
try: result = database.connect()
Q6. Explain except block.
Answer:
The except block handles exceptions.
Example:
except ConnectionError: print( "Database unavailable" )
Q7. Can we have multiple except blocks?
Yes.
Example:
try: value=int(input()) except ValueError: print( "Invalid number" ) except TypeError: print( "Wrong data type" )
Q8. What is the purpose of finally?
Answer:
The finally block always executes.
Used for:
- Closing files
- Database cleanup
- Releasing resources
Example:
try: file=open( "data.txt" ) finally: file.close()
Q9. Does finally always execute?
Usually yes.
Example:
try: print("Hello") finally: print("Cleanup")
Output:
Hello Cleanup
Q10. When finally will NOT execute?
Important interview question.
Normally finally executes, but it may not execute in situations like:
1. Operating system termination
Example:
import os os._exit(0)
The Python interpreter stops immediately.
2. Power failure
Example:
Server loses electricity
No code execution continues.
3. Forceful process termination
Example:
kill -9 process_id
Operating system immediately terminates the process.
Q11. Difference between raise and except?
except
Handles an error.
Example:
try: login() except: print( "Failed" )
raise
Creates an error manually.
Example:
if age < 18: raise Exception( "Not allowed" )
Q12. What is a custom exception?
Creating your own error class.
Example:
class PaymentError(Exception): pass
Usage:
raise PaymentError( "Payment failed" )
Section 2: Intermediate Exception Handling Questions
Q13. Explain exception hierarchy in Python.
Python exceptions follow inheritance.
Example:
BaseException | Exception | RuntimeError | ValueError
Common hierarchy:
Exception ├── ArithmeticError │ └── ZeroDivisionError ├── LookupError │ └── IndexError ├── ValueError ├── TypeError ├── ImportError └── OSError
Q14. Why is exception hierarchy important?
Because we can handle errors at different levels.
Example:
try: process() except ValueError: print( "Data problem" ) except Exception: print( "Unknown error" )
Specific errors are handled first.
Q15. What happens if except order is wrong?
Example:
Wrong:
try: x=int("abc") except Exception: print("Error") except ValueError: print("Value Error")
Output:
Error
Because Exception catches everything first.
Correct:
except ValueError: ... except Exception: ...
Q16. What is exception chaining?
Example:
try: database.save() except Exception as e: raise ApplicationError( "Save failed" ) from e
Benefits:
Keeps:
- Business error
- Original technical error
Q17. What is the difference between error and exception?
Error:
Usually serious problem.
Example:
MemoryError SystemError
Exception:
Recoverable problem.
Example:
ValueError FileNotFoundError
Q18. What is the difference between finally and else?
Example:
try: result=10/2 except: print( "Failed" ) else: print( "Success" ) finally: print( "Completed" )
Output:
Success Completed
else
Runs only when no exception occurs.
finally
Runs always.
Section 3: Advanced Enterprise Questions
Q19. How do you design exception handling in enterprise applications?
Answer:
Use layers:
API Layer ↓ Service Layer ↓ Database Layer ↓ Infrastructure Layer
Each layer handles appropriate failures.
Q20. Where should exceptions be handled?
Answer:
Handle where recovery is possible.
Example:
Database:
Retry connection
API:
Return HTTP response
Application:
Log failure
Q21. Why should we avoid generic Exception?
Bad:
except Exception: pass
Problems:
- Hides bugs
- Difficult debugging
- Poor monitoring
Better:
except DatabaseError: retry_connection()
Q22. How do you log exceptions?
Example:
import logging try: process() except Exception: logging.exception( "Process failed" )
Q23. How do you handle exceptions in APIs?
Example:
FastAPI:
raise HTTPException( status_code=404, detail="Not found" )
Q24. How do you handle database failures?
Example:
try: save_data() except DatabaseError: rollback() retry()
Section 4: AI Engineer Interview Questions
Q25. How do you handle LLM API failures?
Answer:
Use:
- Retry mechanism
- Timeout handling
- Fallback models
- Logging
Example:
try: response=model.generate() except TimeoutError: response=backup_model.generate()
Q26. How do you handle token limit errors?
Example:
if tokens > limit: raise TokenLimitError( "Input too large" )
Solutions:
- Summarization
- Chunking
- Compression
Q27. How do you handle RAG failures?
Pipeline:
Question ↓ Embedding ↓ Vector Search ↓ LLM ↓ Answer
Failures:
- Embedding error
- Vector database failure
- Model timeout
Solution:
try: retrieve_documents() except Exception: fallback_search()
Q28. How do you handle AI hallucination?
Answer:
Use:
- RAG
- Source validation
- Response checking
- Confidence scoring
Section 5: Cloud & DevOps Interview Questions
Q29. How do you handle deployment failures?
Answer:
Use:
- Logging
- Rollback
- Health checks
- Monitoring
Example:
try: deploy() except Exception: rollback()
Q30. How do you handle Kubernetes failures?
Monitor:
- Pod status
- Logs
- Health checks
Recovery:
Restart Pod Scale Application Rollback Deployment
Q31. How do you handle CI/CD pipeline errors?
Pipeline:
Code ↓ Build ↓ Test ↓ Deploy
Example:
try: run_pipeline() except Exception: notify_team() stop_release()
Section 6: Coding Interview Problems
Problem 1
Write a program handling division errors.
Solution:
try: a=int(input()) b=int(input()) print(a/b) except ZeroDivisionError: print( "Cannot divide by zero" ) except ValueError: print( "Enter numbers only" )
Problem 2
Create custom exception for insufficient balance.
Solution:
class InsufficientBalance( Exception ): pass balance=500 withdraw=1000 if withdraw > balance: raise InsufficientBalance( "Low balance" )
Problem 3
Create retry mechanism.
Solution:
for attempt in range(3): try: connect_database() break except Exception: print( "Retrying..." )
Final Interview Preparation Checklist
Before interviews, understand:
✅ try/except/finally
✅ Custom exceptions
✅ Exception hierarchy
✅ Logging
✅ API error handling
✅ Database failures
✅ AI failures
✅ Cloud failures
✅ Kubernetes recovery
✅ Production debugging
How Eduarn Helps You Prepare for Industry Roles
Eduarn programs combine:
AI Engineering
- Python for AI
- Generative AI
- LLM Applications
- RAG
- AI Agents
Cloud & DevOps
- AWS
- Azure
- GCP
- Docker
- Kubernetes
- CI/CD
Python Full Stack
- Python
- FastAPI
- Django
- APIs
- Database Development
Corporate Training
Organizations get:
- Customized learning programs
- Hands-on labs
- Real projects
- Team upskilling
How Eduarn Helps You Build Industry-Ready Skills in AI, Cloud & DevOps
Eduarn helps professionals, students, and organizations develop job-ready skills in Artificial Intelligence, Generative AI, Cloud Computing, DevOps, Kubernetes, and Automation through practical, hands-on learning programs.
With Eduarn's AI training programs, learners gain expertise in Python for AI, Generative AI, Large Language Models (LLMs), Prompt Engineering, RAG applications, AI Agents, and real-world AI projects designed for modern technology careers.
Our Cloud Computing training helps learners master leading cloud platforms including AWS, Microsoft Azure, and Google Cloud Platform (GCP) with practical experience in cloud architecture, deployment, security, and scalable application development.
Through DevOps and SRE training, learners develop skills in Docker, Kubernetes, CI/CD pipelines, Jenkins, Git, Infrastructure Automation, Monitoring, Cloud Deployment, and Production Reliability Engineering used by modern software companies.
Eduarn supports:
✅ Individual career growth
✅ Corporate team training
✅ Hands-on cloud labs
✅ Real-time industry projects
✅ Interview preparation
✅ Enterprise technology upskilling
Whether you are starting your technology career or upgrading your professional skills, Eduarn provides structured learning paths to become an AI Engineer, Cloud Engineer, DevOps Engineer, SRE Engineer, Python Developer, or Full Stack Developer.
Learn AI, Cloud & DevOps with Eduarn and build the skills needed for the future of technology.
SEO Keywords:
AI Training, Generative AI Course, Cloud Computing Training, AWS Training, Azure Training, Google Cloud Training, DevOps Training, Kubernetes Training, Docker Training, CI/CD Training, Python AI Course, SRE Training, MLOps Training, Corporate IT Training, Online Technology Courses, Career Growth Programs.
