Definizione di un'eccezione senza parametri:
class MyException(Exception):
pass
Quando sollevato, c'è qualche differenza tra:
raise MyException
e
raise MyException()
Non ho trovato nessuno; è semplicemente una sintassi sovraccarica?
Definizione di un'eccezione senza parametri:
class MyException(Exception):
pass
Quando sollevato, c'è qualche differenza tra:
raise MyException
e
raise MyException()
Non ho trovato nessuno; è semplicemente una sintassi sovraccarica?
Risposte:
La risposta breve è che entrambi raise MyException
e raise MyException()
fanno la stessa cosa. Questo primo modulo crea automaticamente un'istanza della tua eccezione.
La sezione pertinente dei documenti dice: " raise valuta la prima espressione come oggetto eccezione. Deve essere una sottoclasse o un'istanza di BaseException. Se si tratta di una classe, l'istanza di eccezione verrà ottenuta quando necessario istanziando la classe con nessun argomento. "
Detto questo, anche se la semantica è la stessa, la prima forma è microscopicamente più veloce e la seconda forma è più flessibile (perché puoi passargli argomenti se necessario).
Il solito stile che la maggior parte delle persone usa in Python (cioè nella libreria standard, nelle applicazioni più diffuse e in molti libri) è quello di usare raise MyException
quando non ci sono argomenti. Le persone istanziano direttamente l'eccezione solo quando è necessario passare alcuni argomenti. Ad esempio: raise KeyError(badkey)
.
Vai a guardare i documenti per la raise
dichiarazione . Sta creando un'istanza di MyException
.
raise
è leggermente cambiata in Python 3. La parte rilevante per questa domanda è la stessa ( raise ExceptionType
crea comunque un'istanza del tipo chiamando il suo costruttore senza argomenti).
Sì, c'è una differenza tra ValueError
eValueError()
ValueError
è una classe mentre ValueError()
crea un'istanza di una classe. Questo è il motivo per cui type(ValueError) is type
etype(ValueError()) is ValueError
L'unico scopo di raise
è sollevare l'eccezione,
quando usiamo
ValueError
, verrà chiamata la classe che a sua volta esegue il costruttoreValueError()
quando usiamo
ValueError()
, il metodoValueError()
viene chiamato direttamente.
Nota: raise ValueError # shorthand for 'raise ValueError()'