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.
This rule raises an issue when a class derives from one of the following exception classes: BaseException,
KeyboardInterrupt, SystemExit or GeneratorExit.
class MyException(BaseException): # Noncompliant
pass
class MyException(GeneratorExit): # Noncompliant
pass
class MyException(KeyboardInterrupt): # Noncompliant
pass
class MyException(SystemExit): # Noncompliant
pass
class MyException(Exception):
pass