Che cosa è considerata la migliore procedura per le classi di eccezioni personalizzate?

1

Python ha molte convenzioni forti ma non sono chiaro su come gestire al meglio le eccezioni per il mio modulo. So che è generalmente buona norma definire un'eccezione personalizzata per il tuo modulo. Per esempio:.

class MyError(Exception):
    pass

Tuttavia, quello su cui non sono chiaro è come dovrebbero essere specifiche le classi di eccezioni? Ogni percorso di codice che provoca un errore deve avere una propria classe di eccezioni? O è meglio usare solo alcuni? Una gerarchia di eccezioni in cui ogni eccezione "foglia" eredita da un'eccezione genitoriale un po 'più generica consentirebbe agli utenti del modulo di decidere quanto sia precisa la loro gestione delle eccezioni, ma posso vedere come questo potrebbe diventare complicato da gestire.

So che alcuni moduli utilizzano codici di errore per distinguere tra diversi errori che utilizzano la stessa classe, che viene usata in questo modo:

try:
    mymodule.do_something()
except mymodule.MyError as error:
    if error.code == mymodule.SPECIFIC_ERROR_CODE:
        handle_error()
    else:
        raise

Ma mi sembra sbagliato, a meno che tu non stia simulando in modo appropriato un'altra libreria.

C'è un modo ideale per gestire questo? Oppure questa domanda dipende troppo dalla situazione per una best practice generica?

    
posta ChrisD 18.02.2016 - 10:54
fonte

1 risposta

3

Se la libreria viene utilizzata solo dal proprio codice o dalla propria organizzazione, si applica YAGNI. È necessario creare solo tutte le sottoclassi di eccezioni che è necessario gestire separatamente. Se due diverse condizioni di errore vengono gestite nello stesso modo (che può includere non gestire ma terminare l'applicazione!), Allora hai solo bisogno di una singola classe di eccezione.

In altre parole, crea solo il numero di sottoclassi di cui hai effettivamente bisogno.

Non mi piace l'idea dei codici di errore. Introduce solo un altro modo per segnalare errori che non sono supportati dalla lingua (come mostra l'esempio di codice). Se hai effettivamente bisogno di gestire i diversi codici di errore in modo diverso, potresti anche fare classi di eccezione separate.

    
risposta data 18.02.2016 - 13:58
fonte

Leggi altre domande sui tag