In Python 3, attempting to catch in an except statement an object which does not derive from BaseException will raise a
TypeError. In Python 2 it is possible to raise old-style classes but this shouldn't be done anymore in order to be compatible with Python
3.
In order to catch multiple exceptions in an except statement, a tuple of exception classes should be provided.
If you are about to create a custom Exception class, note that custom exceptions should inherit from Exception, not
BaseException. Exception allows people to catch all exceptions except the ones explicitly asking the interpreter to stop,
such as KeyboardInterrupt and GeneratorExit
which is not an error. See PEP 352 for more information.
This rule raises an issue when the expression used in an except statement is not a class deriving from BaseException nor
a tuple of such classes.
class CustomException:
"""An Invalid exception class."""
try:
"a string" * 42
except CustomException: # Noncompliant
print("exception")
except (None, list()): # Noncompliant * 2
print("exception")
try:
"a string" * 42
except [TypeError, ValueError]: # Noncompliant. Lists are not accepted.
print("exception")
except {TypeError, ValueError}: # Noncompliant. Sets are not accepted.
print("exception")
class MyError(Exception):
pass
try:
"a string" * 42
except (MyError, TypeError):
print("exception")
try statement