Domanda

E 'OK per sollevare un incorporato eccezione con un testo personalizzato? o per sollevare un built-in di avvertimento anche con testo personalizzato?

La documentazione si legge:

  

eccezione ValueError: sollevata quando incorporato in funzione o funzione riceve un argomento (...)

E 'implicito che solo built-in operazioni dovrebbe sollevare un'eccezione ValueError?

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

Dal momento che l'eccezione ValueError è built-in, sollevando un ValueError (con un testo personalizzato) permette agli utenti di vedere rapidamente che tipo di problema è coinvolto, rispetto ad un tipo di eccezione personalizzata (qualcosa come "ValueErrorSpecificModule", che non è standard).

È stato utile?

Soluzione

Non c'è niente di sbagliato con operativamente fare qualcosa di simile:

raise ValueError("invalid input encoding")

In realtà, lo faccio molto spesso, quando sto scrivendo il primo passaggio di un certo codice. Il problema principale con facendo in questo modo è che i clienti del codice hanno un tempo difficile essere precisi nella loro gestione delle eccezioni; al fine di catturare tale eccezione specifica, avrebbero dovuto fare string matching sul oggetto eccezione hanno catturato, che è ovviamente fragile e noioso. Quindi, sarebbe meglio introdurre una sottoclasse ValueError della propria; questo potrebbe ancora essere catturati come ValueError, ma anche come la classe di eccezione più specifica.

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

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

Si dovrebbe probabilmente sostituirlo con qualcosa di simile:

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

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

Altri suggerimenti

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

Nella pagina si è collegato , 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 fissato già la documentazione.
Modifica Sembra che potrebbe essere inserita la documentazione per ValueError invece di TypeError

E '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 il KeyError è davvero proviene da un dict di fondo che si sta utilizzando per l'attuazione.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top