AvoidOrInExceptRule
Discourages use of or
in except clauses. If an except clause needs to catch multiple exceptions,
they must be expressed as a parenthesized tuple, for example:
except (ValueError, TypeError)
(https://docs.python.org/3/tutorial/errors.html#handling-exceptions)
When or
is used, only the first operand exception type of the conditional statement will be caught.
For example:
In [1]: class Exc1(Exception):
...: pass
...:
In [2]: class Exc2(Exception):
...: pass
...:
In [3]: try:
...: raise Exception()
...: except Exc1 or Exc2:
...: print("caught!")
...:
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-3-3340d66a006c> in <module>
1 try:
----> 2 raise Exception()
3 except Exc1 or Exc2:
4 print("caught!")
5
Exception:
In [4]: try:
...: raise Exc1()
...: except Exc1 or Exc2:
...: print("caught!")
...:
caught!
In [5]: try:
...: raise Exc2()
...: except Exc1 or Exc2:
...: print("caught!")
...:
---------------------------------------------------------------------------
Exc2 Traceback (most recent call last)
<ipython-input-5-5d29c1589cc0> in <module>
1 try:
----> 2 raise Exc2()
3 except Exc1 or Exc2:
4 print("caught!")
5
Exc2:
Message
Avoid using ‘or’ in an except block. For example:’except ValueError or TypeError’ only catches ‘ValueError’. Instead, use parentheses, ‘except (ValueError, TypeError)’
Has Autofix: No
VALID Code Examples
# 1:
try:
print()
except (ValueError, TypeError) as err:
pass
INVALID Code Examples
# 1:
try:
print()
except ValueError or TypeError:
pass