TypeError: catching classes that do not inherit from BaseException is not allowed: Causes and Solutions

In the vast world of programming languages Python is one such language used for various purposes, like web development, machine learning, data science, and many more. But like any other programming language, Python is not perfect, and sometimes you may encounter errors or problems when working with it. One such error is the “TypeError: catching classes that do not inherit from BaseException is not allowed” error. This error indicates that the programmer has used a class that does not inherit from the BaseException class, which is the base class for all built-in exceptions in Python, to catch an exception.

This syntax error can lead to unexpected and undesired behavior, such as masking other errors, swallowing important information, or breaking the program logic. This article will explore what this error means, what causes it, and how to resolve it. alongwith some of the frequently asked questions about the error.

By the end of this article, you will better understand the exception handling mechanism in Python and how to avoid and fix the “TypeError: catching classes that do not inherit from BaseException is not allowed” error.

What is the “TypeError: catching classes that do not inherit from BaseException is not allowed” error?

The “TypeError: catching classes that do not inherit from BaseException is not allowed” error is a type of syntax error that occurs when a programmer tries to catch an exception using a class that does not inherit from the BaseException class.

The BaseException class is the base class for all built-in exceptions in Python, and it defines the common attributes and methods for all exception classes. Therefore, any class used to catch an exception must be a subclass of BaseException, either directly or indirectly. For example, the following code will raise TypeError: catching classes that do not inherit from BaseException is not allowed because the MyError class is not a subclass of BaseException:

class MyError:
    pass

try:
    raise MyError()
except MyError:
    print("Caught MyError")

The output of the code is:

TypeError: catching classes that do not inherit from BaseException is not allowed 

What causes the “TypeError: catching classes that do not inherit from BaseException is not allowed” error?

The main cause of the “TypeError: catching classes that do not inherit from BaseException is not allowed” error is using a class that does not inherit from BaseException to catch an exception. This violates the Python syntax rules, which state that the except clause must specify one or more exception types, either classes that derive from BaseException or tuples containing such classes.

This rule ensures that the exception-handling mechanism is consistent and reliable and that only valid exceptions are caught and handled. Suppose a class that does not inherit from BaseException is used to catch an exception. In that case, it may lead to unexpected and undesired behavior, such as masking other errors, swallowing important information, or breaking the program logic.

Another possible cause of the error is using a variable that is not defined or assigned to a class that inherits from BaseException to catch an exception. For example, the code given below will raise the error because the variable MyError is not defined:

Code to raise the TypeError: catching classes that do not inherit from BaseException is not allowed
TypeError: catching classes that do not inherit from BaseException is not allowed

However, if we define the variable MyError and assign it to a class that inherits from BaseException, the code will work as expected:

class MyError(Exception):
    pass

MyError = MyError

try:
    raise MyError("Some error")
except MyError:
    print("Caught MyError")

The output of the code is:

Caught MyError 

How do you resolve the “TypeError: catching classes that do not inherit from BaseException is not allowed” error?

The simplest way to resolve the “TypeError: catching classes that do not inherit from BaseException is not allowed” error is to use a class that inherits from BaseException to catch an exception.

This can be done by either using one of the built-in exception classes, such as Exception, ValueError, or TypeError or by creating a custom exception class that inherits from BaseException or one of its subclasses.

For example, the following code will not raise the error because the MyError class inherits from Exception, which is a subclass of BaseException:

class MyError(Exception):
    pass

try:
    raise MyError("Some error")
except MyError:
    print("Caught MyError")

The output of the code is:

Caught MyError 

Another way to resolve the error is to use a tuple of classes inherited from BaseException to catch multiple exceptions. For example, the following code will not raise the error because the except clause specifies a tuple of exception classes that are subclasses of BaseException:

try:
    x = int(input("Enter a number: "))
    y = 10 / x
except (ValueError, ZeroDivisionError) as e:
    print("Caught an error:", e)

The output of the code is:

Enter a number: 0 
Caught an error: division by zero 

A third way to resolve the error is to use a defined variable assigned to a class inherited from BaseException to catch an exception. For example, the following code will not raise the error because the variable MyError is defined and assigned to the MyError class, which is a subclass of Exception:

class MyError(Exception):
    pass

try:
    raise MyError("Some error")
except MyError:
    print("Caught MyError")

The output of the code is:

Caught MyError 

FAQs

Can I use any class to catch an exception in Python?

You can only use classes that inherit from BaseException, directly or indirectly, to catch an exception in Python. This ensures that the exception-handling mechanism is consistent and reliable and that only valid exceptions are caught and handled.

How can I create a custom exception class in Python?

To create a custom exception class in Python you can start by defining a class that inherits from BaseException or one of its subclasses, such as Exception, ValueError, or TypeError. You can also add your attributes and methods to the custom exception class if they do not conflict with the ones defined by BaseException.

How can I catch multiple exceptions in Python?

You can catch multiple exceptions in Python using a tuple of classes inherited from BaseException to specify the except clause. You can also use a single variable to store the exception object and use the type() or isinstance() functions to check the Exception type.

Conclusion

In this article, we have learned what the “TypeError: catching classes that do not inherit from BaseException is not allowed” error means, what causes it, and how to resolve it. We have also answered some of the frequently asked questions about the error. We hope this article has helped you understand and fix the error in your Python code. Happy coding!

Reference

  1. BaseException
  2. isinstance()

To be up to date with our latest error handling posts follow pythonclear.com/errors.

Leave a Comment