Informa il chiamante o lascia che si occupi di eccezione?

3

Non sono sicuro di come procedere nella seguente situazione.

diciamo che abbiamo una funzione in questo modo:

def runsATask(codes):
    myDicts = [helperFunc(code) for code in codes]
    for item in myDicts:
        # some logic.

Ecco il problema, i codici sono un po 'iterabili e dovrebbero essere o una lista o una tupla, cioè dovrebbe essere usato in questo modo: runsATask(['code1', 'code2', ... 'codeN']) , ma a volte N è 1 e quindi la gente potrebbe chiamarlo per errore, così , runsATask('code1') Questo codice verrà comunque eseguito, ma in seguito in for loop verrà eliminato perché myDicts non ha gli oggetti corretti in esso, perché la comprensione di lista che lo ha fatto ha iterato su un string anziché su a list/tuple .

Quindi dovrei lasciarlo così com'è o sarebbe la seguente soluzione:

def runsATask(codes):
    if not isinstance(codes, (list, tuple)):
        raise Exception("Codes should be a list or a tuple")
    myDicts = [helperFunc(code) for code in codes]
    for item in myDicts:
        # some logic.

Non sono sicuro di quale direzione andare perché ascolto le cerchie di Python per consentire ai chiamanti di risolvere il problema, ma il debug di una situazione come questa può essere fastidioso perché il chiamante si occuperebbe del problema nel ciclo for e aveva è stato informato in anticipo sul fatto che il parametro sbagliato è stato superato, quindi avrebbe risparmiato un sacco di tempo sprecato.

    
posta Edgar Aroutiounian 24.01.2014 - 17:20
fonte

2 risposte

6

Questo codice

if not isinstance(codes, (list, tuple)):
    raise Exception("Codes should be a list or a tuple")

Si chiama Clausola di protezione ed è una tecnica perfettamente valida.

Il motivo per cui si lancia un'eccezione è che (presumibilmente), se codes non è un'istanza di (list, tuple) , il metodo non ha modo di ripristinarlo (a meno che non si desideri restituire un valore predefinito o un codice di errore da il metodo invece).

    
risposta data 24.01.2014 - 18:22
fonte
0

Una clausola di salvaguardia è molto ragionevole, ma hai considerato se esiste un aspetto negativo nel creare una lista e inserire codici in essa se non si tratta di una lista o di una tupla? Se la funzione può compensare senza l'interazione dell'utente che impedirebbe un'eccezione fatale, dovrebbe farlo fintanto che non crea un effetto collaterale.

    
risposta data 24.01.2014 - 18:58
fonte

Leggi altre domande sui tag