2010-07-12 16 views
10

Vorrei conoscere la procedura migliore per sollevare un'eccezione senza argomenti. Nella documentazione ufficiale di Python, si può vedere questo:Python, rasing un'eccezione senza argomenti

try: 
    raise KeyboardInterrupt 

(. http://docs.python.org/tutorial/errors.html cap 8.6)

e in qualche codice differenti, come Django o il codice di Google, si può vedere questo:

def AuthenticateAndRun(self, username, password, args): 
    raise NotImplementedError() 

(http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py)

L'eccezione è instanciate prima di essere sollevato mentre non v'è alcun argomento. Qual è lo scopo di instanciare un'eccezione senza argomenti? Quando dovrei usare il primo caso o il secondo caso?

Grazie in anticipo Fabien

risposta

3

alzando un classe di eccezione, invece di un'istanza eccezione è deprecato sintassi e non devono essere utilizzati nel nuovo codice.

raise Exception, "This is not how to raise an exception..." 
+0

Per chi è curioso, vedere http://www.python.org/dev/peps/pep-0352/#transition-plan per ulteriori informazioni sulla deprecazione relativa alle eccezioni. –

+8

Non riesco a capire cosa stai raccomandando. Il tuo esempio di codice sembra essere quello che ** non ** fare. Forse dovresti mostrare cosa * dovrebbe * essere fatto. –

+0

Ancora non si sa cosa dovrebbe essere fatto. – FrenchKheldar

0

In lingue come C++ è possibile generare qualsiasi oggetto, non solo Eccezioni. Python è più limitato. Se si tenta:

raise 1 

Si ottiene:

Traceback (most recent call last): 
... 
TypeError: exceptions must be old-style classes or derived from BaseException, not int 

Nel modello di programmazione Python di solito si può utilizzare una classe a sé, invece di un'istanza (questo è utile per la creazione veloce di istanze univoche, basta definire una classe). Quindi non c'è da meravigliarsi che si possa generare una classe di eccezioni invece di un'istanza di eccezione.

Tuttavia, come ha detto Ignacio, è deprecato.

Inoltre, alcuni side-nota che non è il diretto interessato:

Si potrebbe anche vedere alzare da solo da solo in un certo codice. Senza alcuna classe di oggetti o nulla. Viene utilizzato nei gestori di eccezioni per sollevare nuovamente l'eccezione corrente e manterrà il traceback iniziale.

3

È possibile utilizzare qualsiasi modulo che ti piace. Non c'è alcuna differenza reale ed entrambi sono legali in Python 2 e 3. Python style guide non specifica quale sia raccomandato.


Un po 'più di informazioni sul supporto "modulo di classe":

try: 
    raise KeyboardInterrupt 

Questa forma è perfettamente legale sia in Python 2 e 3. Estratto pep-3109:

rilancio EXCEPTION viene utilizzato per generare una nuova eccezione. Questo modulo ha due sotto-varianti : EXCEPTION può essere una classe di eccezione o un'istanza di una classe di eccezione ; le classi di eccezioni valide sono BaseException e le sue sottoclassi [5].Se EXCEPTION è una sottoclasse, verrà chiamato senza argomenti per ottenere un'istanza di eccezione.

è anche descritto in Python documentation:

... Se è una classe, l'istanza di eccezione sarà ottenuta quando necessario istanziando classe senza argomenti.

Problemi correlati