Exceptions in Python with Examples

authorImagePunit Kumar11 Mar, 2026
Exceptions in Python with Examples

Error handling is not just an afterthought in the design of a strong software application; it is a key part of it. Python has a full array of exceptions, including ValueError, TypeError, and IndexError. However, these standard errors are often too broad for specialised business logic. This is when user-defined exceptions come in handy.

You can make your own exceptions to describe special fault circumstances that are only relevant to your app. For example, in a banking app, you could use InsufficientFundsError or InvalidSensorDataError in an IoT system. At PW Skills, we stress that learning how to use custom exceptions in Python lets you develop code that is not only "bug-free," but also easy to read and maintain.

Exceptions in Python

An exception is something that happens while a program is running that stops the normal flow of instructions. When a Python script encounters a situation it cannot cope with, it raises an exception.

Built-in vs. User-defined

  • Built-in Exceptions: Python gives you these to deal with common problems, such ZeroDivisionError. You may discover a full list of exceptions in Python on w3schools or in the official documentation.
  • User-defined Exceptions: User-defined exceptions are special classes that developers construct to show specific faults in their domain logic.

Why Use User-defined Exceptions in Python?

Standard exceptions in Python examples don't always show what a mistake "means." If a user types in an age of -5, a ValueError might be technically accurate, but a NegativeAgeError is much clearer for a developer who is trying to fix the system.

Benefits include:

  • Clarity: Clearly states what went wrong in the business logic.
  • Granular Handling: You can catch your unique exception without catching every other ValueError in the program.
  • Maintenance:Gives you useful stack traces that make it easier to find your way around big codebases.

How to Create User-defined Exceptions in Python?

There is a built-in Exception class in Python, and all exceptions must be classes that inherit from it, either directly or indirectly.

The Basic Syntax

Python class MyCustomError(Exception): """Base class for other exceptions""" pass class ValueTooSmallError(MyCustomError): """Raised when the input value is too small""" pass

Exceptions in Python Example: Age Validation

Let's look at a real-life example of exceptions in Python where we stop a user from inputting an age that doesn't make sense. Python class InvalidAgeError(Exception): def __init__(self, age, message="Age must be between 18 and 100"): self.age = age self.message = message super().__init__(self.message) def check_age(age): if not (18 <= age <= 100): raise InvalidAgeError(age) print(f"Access granted for age: {age}") try: user_age = 15 check_age(user_age) except InvalidAgeError as e: print(f"Error: {e.message}. You provided: {e.age}")

Custom Exceptions in Python for specific Domains

Custom exceptions are quite helpful in libraries and frameworks that are made for specific purposes.

4.1 Exceptions in Python Selenium

When you automate the web with Python Selenium, you commonly run into common problems like NoSuchElementException. But you might say for a complicated testing suite:
  • LoginTimeoutError: This error happens when the dashboard doesn't load even when the credentials are correct.
  • ElementNotInteractableError: A custom wrapper for when a button is there but a pop-up is blocking it.

4.2 Exceptions in API Development

If you are building a REST API, custom exceptions help return specific HTTP status codes.
  • RateLimitExceeded: To trigger a 429 status.
  • ResourceNotFoundError: To trigger a 404 status.

Best Practices for Custom Exceptions in Python

To keep your code clean and professional, follow these industry standards:
  1. Inherit from Exception: Never inherit from BaseException directly; that is reserved for system-level exits.
  2. Naming Convention: Always end your class name with "Error" (e.g., DatabaseConnectionError).
  3. Use Docstrings: Be clear about the exact criteria that cause the exception to be raised.
  4. Keep it Simple: Don't put complicated logic in your exception class. It keeps track of and sends error messages.
  5. Create a Base Class: Make one AppBaseError for big applications and have all other custom exceptions inherit from it. This allows you to catch any error from your specific app using one except block.

Difference between Standard vs. User-defined exceptions in Python

Let’s understand the difference between standard and User-defined exceptions in Python.
Feature Standard Exceptions User-defined Exceptions
Origin Built into Python core Defined by the developer
Purpose Handle generic technical errors Handle specific domain/business logic
Examples KeyError, ImportError LowBalanceError, ExpiredTokenError
Scalability Limited to syntax/runtime issues Highly scalable for large apps

Adding Extra Data to Exceptions in Python 

Custom exceptions can store more than just a message. You can pass objects, error codes, or timestamps to help with logging. Python class DatabaseError(Exception): def __init__(self, table, error_code): self.table = table self.error_code = error_code super().__init__(f"Database failure at {table}. Code: {error_code}") # This allows the catching block to log the specific table name for debugging.

Conclusion

An advanced developer knows how to deal with exceptions in Python. The standard exceptions list in Python covers the basics, but user-defined exceptions enable you utilise the language that is specific to your application. Custom errors make sure that when things go wrong, they do so in an open and polite way, whether you're validating user data or handling exceptions in Python Selenium scripts. We at PW Skills think that "Code is for people to read and machines to run." Custom exceptions make your code much easier to comprehend and make sure that the machine deals with faults in a way that is straightforward to understand. Also Read :

FAQs

Is it mandatory to inherit from the Exception class?

Yes. Your class must be a subclass of BaseException in order for the raise keyword to work. For all failures that don't cause the system to crash, inheriting from Exception is the norm.

Is it possible to raise a built-in exception instead of a bespoke one?

Yes, and you should if it fits exactly (for example, using ValueError for the improper kind of input). Only use custom exceptions when the built-in ones don't give you enough information about the error.

Where should I define my custom exceptions?

In small scripts, you can place them at the top. It's customary for professional projects to have an exceptions.py or errors.py file in their module.

How do I catch more than one custom exception?

You can catch them in different blocks or as a group: except (ConnectionError, TimeoutError) as e:

Do specific exceptions slow down the code?

No. It takes a little effort to raise an exception, but it's not much compared to the benefits of having software that is safe and quick to fix.