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