org.sonar.l10n.py.rules.python.S5714.html Maven / Gradle / Ivy
This rule raises an issue when the expression used in an except
block is a boolean expression of exceptions.
Why is this an issue?
The only two possible types for an except
's expression are a class deriving from BaseException
, or a tuple composed of
such classes.
Trying to catch multiple exception in the same except
with a boolean expression of exceptions may not work as intended. The result of
a boolean expression of exceptions is a single exception class, thus using a boolean expression in an except
block will result in
catching only one kind of exception.
error = ValueError or TypeError
error is ValueError # True
error is TypeError # False
error = ValueError and TypeError
error is ValueError # False
error is TypeError # True
Note: In Python 2 it is possible to raise an exception from an old-style class that does not derive from
BaseException
.
How to fix it
Make sure to use a tuple of the exceptions that should be caught in the except
block.
Code examples
Noncompliant code example
try:
raise TypeError()
except ValueError or TypeError: # Noncompliant
print("Catching only ValueError")
except ValueError and TypeError: # Noncompliant
print("Catching only TypeError")
except (ValueError or TypeError) as exception: # Noncompliant
print("Catching only ValueError")
foo = ValueError or TypeError # foo == ValueError
foo = ValueError and TypeError # foo == TypeError
Compliant solution
try:
raise TypeError()
except (ValueError, TypeError) as exception:
print("Catching ValueError and TypeError")
Resources
Documentation
- the
try
statement - Python try statement
© 2015 - 2024 Weber Informatics LLC | Privacy Policy