wyjątkami pochodzące z BaseException
są: GeneratorExit
, KeyboardInterrupt
, SystemExit
.
Zgodnie z dokumentacją:
GeneratorExit
: Podniesiony gdy generator jest metoda close() jest wywoływana. Dziedziczy bezpośrednio z BaseException zamiast StandardError, ponieważ technicznie nie jest to błąd.
KeyboardInterrupt
: Wywoływany, gdy użytkownik uderzy w klawisz przerwania (zwykle Control-C lub Delete). Podczas wykonywania, kontrola przerwania jest wykonywana regularnie. Przerwania wpisywane, gdy wbudowana funkcja input() lub raw_input() czeka na wejście, również podnoszą ten wyjątek. Wyjątek dziedziczy po BaseException, aby nie zostać przypadkowo przechwycony przez kod przechwytujący wyjątek, co uniemożliwiłoby wyjście z niego.
SystemExit
: Wyjątek dziedziczy po BaseException zamiast StandardError lub Exception, aby nie został przypadkowo przechwycony przez kod przechwytujący wyjątek. Dzięki temu wyjątek może poprawnie propagować i powodować, że interpreter wychodzi.
Więc zwykłych powodów jest zapobieganie try ... except Exception
przypadkowo uniemożliwić wyjście tłumacza (z wyjątkiem GeneratorExit
)
UPDATE po obejrzeniu komentarz Ashwini Chaudhary za:
PEP 352 - Required Superclass for Exceptions wyjaśnia przyczyny.
z hierarchią wyjątków teraz jeszcze ważniejsze, ponieważ ma to podstawowy pierwiastek, zmiana istniejącej hierarchii nazywa. Ponieważ obecnie jest to , jeśli chcemy przechwycić wszystkie wyjątki, które sygnalizują błąd i nie oznacza to, że tłumaczowi powinno się zezwolić na wyjście, należy podać określić wszystkie oprócz dwóch wyjątków w klauzuli except lub . a następnie ponownie podnieść je i mieć wszystkie inne wyjątki spadać aż do gołe z wyjątkiem klauzuli:
except (KeyboardInterrupt, SystemExit):
raise
except:
...
czyli niepotrzebnie jednoznaczne. To PEP proponuje przeniesienie klawiatury i interpretera SystemExit do odziedziczenia bezpośrednio od BaseException.
[PEP 352] (https://www.python.org/dev/peps/pep-0352/) prawie to wyjaśnia. –