2011-11-28 13 views
17

Qual è la classe di eccezione "corretta" da sollevare quando una delle mie funzioni rileva None passato dove è richiesto un valore di argomento? Per esempio:Eccezione corretta da sollevare se Nessuno incontrato come argomento

def MyFunction(MyArg1, MyArg2): 

    if not MyArg2: 
      raise ?Error? 

Penso che ho visto TypeError qui usato (ed è vero che sto ricevendo un NoneType dove ci si aspetta qualche altro tipo), ma che non mi sembra giusto per questa situazione dove penso che l'eccezione potrebbe essere più esplicita.

+0

Non dovresti fare questo tipo di controllo degli argomenti. Semplicemente lascia che fallisca ulteriormente con qualsiasi eccezione con cui fallisce. (E se davvero * devi * fare questo, 'TypeError' è l'eccezione corretta.Aggiunga una stringa di spiegazione per renderla più specifica.) –

+0

Probabilmente avrei sollevato un' TypeError', dare un'occhiata alle eccezioni python integrate documentazione: http://docs.python.org/library/exceptions.html –

+0

@Sven: di solito faccio come suggerisci, ma questo è un caso speciale in cui voglio fare questo controllo. –

risposta

29

Non esiste alcuna eccezione incorporata "argomento non valido" o "puntatore nullo" in Python. Invece, la maggior parte delle funzioni aumenta TypeError (tipo non valido come NoneType) o ValueError (tipo corretto, ma il valore è esterno al dominio accettato).

Se la funzione richiede un oggetto di una classe particolare e ottiene None, dovrebbe probabilmente aumentare TypeError come indicato. In questo caso, si dovrebbe verificare la presenza di None esplicitamente, però, dal momento che un oggetto di tipo corretto può valutare in boolean False se implementa __nonzero__/__bool__:

if MyArg2 is None: 
    raise TypeError 

docs Python:

-1

Basta usare assert:

assert type(MyArg2) == int 

O in alternativa:

assert type(MyArg2) != None 

Questo sarà evitare che qualcuno si passa il tipo sbagliato, così come affrontare il problema Nessuno. Restituirà un AssertionError, as per the docs.

+1

Questo è completamente contrario allo spirito di dattilografia di Python. Implica inutili restrizioni sull'applicabilità del codice. (Non è il mio downvote, btw) –

+1

@SvenMarnach Hmm, l'ho usato con successo * a causa della * digitazione anatra.Vale a dire, la digitazione anatra ha nascosto * perché * qualcosa sta fallendo. Se ti senti in dovere di dire questo e tale deve essere così prima di iniziare, affermare è semplicemente un modo conveniente per farlo. Ad esempio, scrivere una funzione con un ciclo for su una variabile di input. Si presume che sia un elenco di nomi di file per il globbing. Che succede se invece di passare una lista con un oggetto, passi una stringa con caratteri globali? –

+1

Il problema con l'asserzione è che ignora i valori che potrebbero servire perfettamente come (in questo esempio) interi, compresi interi lunghi, float (in molte circostanze, ad esempio 'range()'), e qualsiasi oggetto che implementa il '__int__() 'metodo speciale. Un approccio migliore, se ritieni di aver bisogno di questo genere di cose, potrebbe essere semplicemente provare a forzare l'argomento a intero all'inizio del metodo, ad es. 'MyArg2 = int (MyArg2)'. – kindall

2

La maggior parte della funzione Python solleva TypeError se viene passato un argomento come None. Prendere qualsiasi funzione dire chr(None) e vederlo solleva TypeError.

2

Come altri hanno notato, TypeError o ValueError sarebbe naturale. Se non sembra abbastanza specifico, puoi sottoclasse qualsiasi delle due eccezioni sia più adatta. Ciò consente una gestione coerente di argomenti non validi per un'ampia classe di funzioni, fornendo al tempo stesso maggiori dettagli per la particolare funzione.

Problemi correlati