All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sonar.l10n.py.rules.python.S5714.html Maven / Gradle / Ivy

There is a newer version: 4.23.0.17664
Show newest version

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





© 2015 - 2024 Weber Informatics LLC | Privacy Policy