2015-09-11 6 views
7

abbastanza nuovo per Python qui. Avere questo codice:Python, distinguendo le eccezioni personalizzate

def someFunction(num): 
    if num < 0: 
     raise Exception("Negative Number!") 
    elif num > 1000: 
     raise Exception("Big Number!") 
    else: 
     print "Tests passed" 


try: 
    someFunction(10000) 
except Exception: 
    print "This was a negative number but we didn't crash" 
except Exception: 
    print "This was a big number but we didn't crash" 
else: 
    print "All tests passed and we didn't crash" 

Originariamente ho usato raise "Negative Number!" ecc, ma rapidamente scoperto che questo era il vecchio modo di fare le cose e si deve chiamare la classe Exception. Ora funziona bene, ma come faccio a distinguere tra le mie due eccezioni? Per il codice qui sotto è la stampa "Questo era un numero negativo ma non siamo andati in crash". Qualsiasi suggerimento su questo sarebbe fantastico. Grazie!

+0

Sede [la documentazione] (https: // docs .python.org/2/tutorial/errors.html). – erip

+3

Solitamente non si genera 'Exception', ma qualche sottoclasse di esso. –

risposta

11

è necessario creare le proprie classi di eccezioni se si desidera essere in grado di distinguere il tipo di eccezione che si è verificato. Esempio (ho ereditato dai ValueError come penso che questo è il più vicino a ciò che si vuole - ma permette anche di cogliere solo ValueError deve la distinzione non importa):

class NegativeError(ValueError): 
    pass 

class BigNumberError(ValueError): 
    pass 

def someFunction(num): 
    if num < 0: 
     raise NegativeError("Negative Number!") 
    elif num > 1000: 
     raise BigNumberError("Big Number!") 
    else: 
     print "Tests passed" 

try: 
    someFunction(10000) 
except NegativeError as e: 
    print "This was a negative number but we didn't crash" 
    print e 
except BigNumberError as e: 
    print "This was a big number but we didn't crash" 
    print e 
else: 
    print "All tests passed and we didn't crash" 
+4

[Usa 'eccetto ... come ...' invece di 'eccetto ..., ...'] (http://stackoverflow.com/a/2535770/2846140) – Vincent

+0

accetto ... aggiornato. –

+0

Grazie per questo, ottima soluzione. NegativeError è e equivalente a NegativeError, e? – Kex