Definiowanie bezparametrowego wyjątku:
class MyException(Exception):
pass
Czy po podniesieniu jest jakaś różnica między:
raise MyException
i
raise MyException()
Nie mogłem znaleźć żadnego; czy to po prostu przeładowana składnia?
Definiowanie bezparametrowego wyjątku:
class MyException(Exception):
pass
Czy po podniesieniu jest jakaś różnica między:
raise MyException
i
raise MyException()
Nie mogłem znaleźć żadnego; czy to po prostu przeładowana składnia?
Odpowiedzi:
Krótka odpowiedź brzmi: jedno raise MyException
i drugie raise MyException()
robi to samo. Ta pierwsza forma automatycznie tworzy instancję wyjątku.
Istotne odcinek od docs mówi, " podbicie ocenia pierwsze wyrażenie jako obiekt wyjątku. To musi być podklasą lub instancją BaseException. Jeśli jest to klasa, wystąpienie wyjątku zostaną uzyskane, gdy są potrzebne przez instancję klasy z bez argumentów. "
To powiedziawszy, mimo że semantyka jest taka sama, pierwsza forma jest mikroskopijnie szybsza, a druga forma jest bardziej elastyczna (ponieważ w razie potrzeby można przekazać jej argumenty).
Typowy styl, którego większość ludzi używa w Pythonie (tj. W bibliotece standardowej, w popularnych aplikacjach i wielu książkach) jest używany, raise MyException
gdy nie ma argumentów. Ludzie tworzą wyjątek bezpośrednio tylko wtedy, gdy trzeba przekazać jakieś argumenty. Na przykład: raise KeyError(badkey)
.
Zajrzyj do dokumentacji dotyczącej raise
oświadczenia . Tworzy instancję MyException
.
raise
zmieniła się nieco w Pythonie 3. Część, która dotyczy tego pytania, jest jednak taka sama ( raise ExceptionType
nadal tworzy instancję typu przez wywołanie konstruktora bez argumentów).
Tak, jest różnica między ValueError
iValueError()
ValueError
jest klasą, podczas gdy ValueError()
tworzy instancję klasy. To jest powód, dla którego type(ValueError) is type
itype(ValueError()) is ValueError
Jedynym celem raise
jest zgłoszenie wyjątku,
kiedy użyjemy
ValueError
, zostanie wywołana klasa, która z kolei uruchomi konstruktorValueError()
kiedy używamy
ValueError()
, metodaValueError()
jest wywoływana bezpośrednio.
Uwaga: raise ValueError # shorthand for 'raise ValueError()'