2010-02-01 7 views
20

E 'OK alzare un built-in exception con un testo personalizzato? o per aumentare un built-in warning anche con testo personalizzato?È corretto generare un'eccezione built-in, ma con un messaggio diverso, in Python?

La documentazione si legge:

exception ValueError: Raised when a built-in operation or function receives an argument (…)

E 'implicito che solo operazioni integrate dovrebbero sollevare un'eccezione ValueError?

In pratica, capisco che è sicuro creare una classe di eccezione che eredita da ValueError o Exception. Ma è OK non farlo e sollevare direttamente un ValueError ("testo personalizzato")?

Poiché ValueError è integrato, l'aumento di un'eccezione ValueError (con un testo personalizzato) consente agli utenti di vedere rapidamente il tipo di problema coinvolto, rispetto a un tipo di eccezione personalizzato (qualcosa come "ValueErrorSpecificModule", che non è standard) .

+2

Assicurarsi di rispettare la gerarchia delle eccezioni. È improbabile che, se si considera un'eccezione standard come "TypeError", quella sottoclasse di "Exception" sarebbe sempre una buona alternativa. Sottoclassi 'StandardError' forse ...' importa eccezioni come e; help (e) 'mostra l'albero. –

risposta

21

Non c'è niente di vista operativo di sbagliato nel fare qualcosa di simile:

raise ValueError("invalid input encoding") 

In realtà, lo faccio abbastanza spesso quando ho sto scrivendo il primo passaggio di un codice. Il problema principale nel farlo in questo modo è che i client del tuo codice hanno difficoltà a essere precisi nella loro gestione delle eccezioni; al fine di catturare quell'eccezione specifica, dovrebbero eseguire la corrispondenza delle stringhe sull'oggetto di eccezione che hanno catturato, il che è ovviamente fragile e noioso. Quindi, sarebbe meglio introdurre una propria sottoclasse ValueError; questo potrebbe ancora essere catturato come ValueError, ma anche come la classe di eccezioni più specifica.

Una regola generale è che ogni volta che si dispone di codice come:

raise ValueError('some problem: %s' % value) 

probabilmente si dovrebbe sostituirlo con qualcosa di simile:

class SomeProblem(ValueError): 
    """ 
    Raised to signal a problem with the specified value. 
    """ 
# ... 
raise SomeProblem(value) 

Si potrebbe dire che il tipo di eccezione specifica cosa è andato storto, mentre il messaggio/attributi specifica come è andato storto.

2

È perfettamente ok.

Tuttavia si consiglia di creare il proprio sottoclasse per aiutare a distinguere le eccezioni built

Per esempio, se avete qualcosa che funziona come un dict, è possibile sollevare un KeyError per i soliti motivi, ma cosa succede se la KeyError deriva in realtà da una dict sottostante che stai usando nell'implementazione.

Raising una sottoclasse di KeyError rende più facile vedere che c'è un bug nell'implementazione, e non che la chiave non è solo nel vostro oggetto

4

Va bene e lo faccio tutto il tempo. Trovo meno sorprendente vedere TypeError di MySpecialTypeError in molte situazioni.

Sul page you linked, non vedo la frase "built-in":

exception TypeError: Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch. 

Forse qualcuno ha visto la tua domanda e fissa già la documentazione.
EDIT: Sembra che potrebbe essere inserita la documentazione per ValueError invece di TypeError

+0

Buona presa. Grazie! – EOL