2013-05-23 12 views
41

Definiowanie wyjątku bez parametrów:Czy istnieje różnica między "podniesienia wyjątku()" i "podniesienia wyjątku" bez nawiasu?

class myException(Exception): 
    pass 

Kiedy podniesione, czy istnieje różnica pomiędzy:

raise myException 

i

raise myException() 

Podczas próby, udało mi się znaleźć żadnego - czy jest to po prostu przeciążona składnia?

+0

możesz potrzebować przekazać kilka argumentów w '()' jak 'raise NameError ('HiThere')' przeczytaj [8.4. Podnoszenie wyjątków] (http://docs.python.org/2/tutorial/errors.html#raising-exceptions) –

+0

@GrijeshChauhan: Myślę, że pytanie dotyczy 'raise NameError' vs' raise NameError() '. – Blender

+0

@Blender Tak po prostu zrozumiałem pytanie, jestem również nowy uczeń :) –

Odpowiedz

37

Krótka odpowiedź jest taka, że ​​zarówno raise MyException i raise MyException() zrobić to samo. Ta pierwsza forma automatycznie tworzy twój wyjątek.

relevant section from the 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 w razie potrzeby przez utworzenie wystąpienia klasa bez argumentów. "

Mimo że semantyka jest taka sama, pierwsza forma jest mikroskopowo szybsza, a druga forma jest bardziej elastyczna (ponieważ w razie potrzeby można przekazać jej argumenty).

Typowym stylem używanym przez większość ludzi w Pythonie (tj. W standardowej bibliotece, w popularnych aplikacjach iw wielu książkach) jest użycie raise MyException, gdy nie ma żadnych argumentów. Ludzie tworzą instancję wyjątku tylko wtedy, gdy trzeba przekazać pewne argumenty. Na przykład: raise KeyError(badkey).

+6

Dlaczego pierwsza forma (bez nawiasów) byłaby mikroskopowo szybsza? – jamesdlin

6

Go spojrzenie na kluczowych podbicie docs 6.9. The raise statement
jest utworzenie instancji myException

+0

Warto zauważyć, że [składnia dla 'raise'] (http://docs.python.org/3/reference/simple_stmts.html#raise) nieco się zmieniła w Pythonie 3. Część, która jest istotna dla tego pytania, jest to samo jednak ('raise ExceptionType' nadal tworzy instancję typu, wywołując jego konstruktor bez żadnych argumentów). – Blckknght