Come faccio a sapere che tipo di eccezione dovrei sollevare?

0

Suppongo che questa domanda sia valida per qualsiasi linguaggio di programmazione in grado di gestire (o almeno lanciare) un exception . Comunque mi atterro a Python come esempio.

Le prime 2 risposte alla seguente domanda non concordano tra loro su un punto particolare. link

In questo momento (14 marzo 2015 Sat 2354 hrs) sembra che ci sia un crescente consenso attorno alla seconda risposta (la risposta di Aaron Hall nel caso in cui qualcosa di simile cambi in futuro). E penso di avere il merito di essere specifico sul tipo di eccezione che dovrei sollevare. Viene fornita una gerarchia per Python qui: link

Ora, sono al punto in cui voglio sollevare manualmente un'eccezione quando una divisione produce un non intero. In particolare, ho un array 2D e ho anche il numero di colonne in esso. Se la divisione del primo da parte del secondo risulta in un non intero, significa che il numero di righe è un numero intero, e quindi qualcosa è incasinato da qualche parte. E voglio aumentare un exception .

Perché sarebbe sbagliato includere solo raise Exception("Something's wrong. Number of rows is not an integer!") nel mio codice? Le categorie nella gerarchia sono solo parole in inglese, ma non sono in grado di scegliere la categoria migliore per il mio scopo. Quindi cosa c'è di sbagliato nella spiegazione chiara del problema nel mio messaggio (che per il presente esempio è il problema che il numero di righe non è un intero)?

    
posta Shashank Sawant 15.03.2015 - 05:06
fonte

2 risposte

3

Stai creando un'interfaccia utente: il codice è un'interfaccia utente, in cui "utente" è un altro programmatore o un'altra funzione. Se tu fossi l'utente del tuo codice piuttosto che lo sviluppatore, cosa renderebbe il tuo codice più facile da usare? Quindi, guarda questo problema dal punto di vista di qualcuno che chiama la tua funzione. Quale sarebbe l'eccezione più utile che potresti dare? Nota: potrebbero esserci più risposte, nel qual caso non importa molto. Il punto è, rendi il tuo codice il più facile da usare possibile.

L'altra cosa importante da ricordare è questa: potresti inviare solo un'eccezione, ma il tuo codice potrebbe inviare molti. L'eccezione che lanci ha bisogno di giocare bene con tutte le altre possibili eccezioni (nel senso che deve essere distinguibile dalle altre eccezioni).

In questo caso specifico (e nella maggior parte dei casi ...), un'eccezione generica non è particolarmente utile. Ci potrebbe essere più di un modo in cui la tua funzione fallisce. Forse gli input sono float invece di interi. Forse sono stringhe. O forse gli input determinano una divisione per zero. Il chiamante potrebbe interessarsi di queste distinzioni. Forse non lo faranno, ma potrebbero. E se non ora, potrebbero in futuro.

    
risposta data 15.03.2015 - 13:47
fonte
1

Aumentare una xception generica e differenziarla solo dal suo messaggio sarebbe errata perché, se ne hai molti e vuoi reagire in modo appropriato , come li distingueresti?

Per quanto riguarda la scelta dell'eccezione, prendendo il tuo esempio, direi che ArithmeticError è qualcosa di piuttosto di basso livello e focalizzato sugli aspetti aritmetici del problema. Nel tuo caso, è un errore aritmetico il fatto che 7 non sia divisibile per 3? No, aritmeticamente è corretto.

Questo è un problema se preso da un altro punto di vista, vale a dire quello della logica dell'applicazione, quindi tale eccezione avrebbe senso solo nella tua applicazione. Creo il mio (ad esempio NonDivisibleTableError derivato da Exception ).

Ora, come è potuto accadere? Questo è un altro problema, ma una rapida ricerca ha dimostrato che anche in Python è possibile specificare una causa quando si genera un'eccezione (vedere aumento / da ). In questo modo puoi descrivere cosa è andato storto ai diversi livelli della tua applicazione, (ad esempio NonDivisibleTableError causato da alcuni IOError ) e dare all'utente un messaggio di errore più ragionato.

    
risposta data 15.03.2015 - 11:36
fonte

Leggi altre domande sui tag