2015-01-17 6 views
6

The Python 2 documentation mówi, że "programiści są zachęcani do wyprowadzania nowych wyjątków z klasy Wyjątek lub jednej z jej podklas, a nie z BaseException". Bez żadnego dodatkowego wyjaśnienia, dlaczego.Dlaczego zaleca się wyprowadzać z klasy Exception zamiast klasy BaseException w Pythonie?

Jestem ciekawy, dlaczego jest to zalecane w ten sposób? Czy jest to po prostu zachowanie exceptions hierarchy, tak jak to wyobrazili sobie programiści Pythona?

>>> dir(BaseException) == dir(Exception) 
True 
+2

[PEP 352] (https://www.python.org/dev/peps/pep-0352/) prawie to wyjaśnia. –

Odpowiedz

10

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.

Powiązane problemy