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 MyExceptioni 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 MyExceptiongdy 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 raiseoświadczenia . Tworzy instancję MyException.
raise zmieniła się nieco w Pythonie 3. Część, która dotyczy tego pytania, jest jednak taka sama ( raise ExceptionTypenadal tworzy instancję typu przez wywołanie konstruktora bez argumentów).
Tak, jest różnica między ValueErroriValueError()
ValueErrorjest klasą, podczas gdy ValueError()tworzy instancję klasy. To jest powód, dla którego type(ValueError) is typeitype(ValueError()) is ValueError
Jedynym celem raisejest 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()'