org.sonar.l10n.py.rules.python.S5709.html Maven / Gradle / Ivy
This rule raises an issue when a class derives from one of the following exception classes: BaseException
,
KeyboardInterrupt
, SystemExit
or GeneratorExit
.
Why is this an issue?
SystemExit
is raised when sys.exit()
is called. KeyboardInterrupt
is raised when the user asks the program
to stop by pressing interrupt keys. Both exceptions are expected to propagate up until the application stops.
In order to avoid catching SystemExit
and KeyboardInterrupt
by mistake, PEP-352 created the root class BaseException
from which
SystemExit
, KeyboardInterrupt
and Exception
derive. Thus developers can use except Exception:
without preventing the software from stopping.
The GeneratorExit
class also derives from BaseException
as it is not really an error and is not supposed to be caught by
user code.
As said in Python’s documentation, user-defined exceptions are not
supposed to inherit directly from BaseException
. They should instead inherit from Exception
or one of its subclasses.
Code examples
Noncompliant code example
class MyException(BaseException): # Noncompliant
pass
Compliant solution
class MyException(Exception):
pass
Resources
Documentation
- PEP 352 – Required Superclass for Exceptions
- Python Documentation - BaseException class