Accedi al try-catch o dopo? [chiuso]

1

Si dovrebbe registrare l'esito positivo di un'operazione all'interno di un blocco try-catch o dopo?

Esempio:

try
    do x
    log('successful')
catch
    log('fail')
end

o è meglio:

try
    do x
catch
    log('fail')
end
log('successful')

Direi che un logger non dovrebbe mai fallire, ma cosa succede se, per qualche ragione, lo fa comunque?

In questo caso specifico, avevo un file di log su un'unità di rete che si disconnetteva a causa di azioni di do (x), che tuttavia non fallivano - ovviamente il mio tentativo fallì, ma la mia operazione funzionò. Tuttavia, trovo che l'ultimo esempio sia più difficile da leggere e cerco di mantenere il mio codice il più stretto possibile per la leggibilità.

    
posta phi 13.08.2014 - 10:44
fonte

3 risposte

3

Prima di tutto, devi assicurarti che la registrazione non generi mai eccezioni. È meglio non registrare un messaggio piuttosto che interrompere la logica del programma.

Oltre a ciò, il tuo secondo codice in caso di successo registrerebbe:

"successful"

ma un errore registra 2 messaggi:

"fail"
"successful"

Penso che non sia quello che vuoi, quindi un primo esempio è la strada da percorrere.

    
risposta data 13.08.2014 - 12:17
fonte
1

Per rispondere alla tua domanda devi veramente rispondere alle seguenti domande: tratteresti un errore di chiamata di registro come un fallimento dell'intero blocco try ? Se sì, allora apparterrà lì. Altrimenti, dovrebbe essere posizionato all'esterno. L'idea più grande è di gestire la granularità dei blocchi try , in modo da ottenere il giusto insieme di eccezioni.

    
risposta data 13.08.2014 - 10:52
fonte
1

I would say that a logger should never fail, but what if, for some reason, it does anyway?

Questo non ha senso nel tuo scenario:

try
    do x
    log('successful')
catch
    log('fail')
end

Se il tuo primo logger fallisce, viene generata un'eccezione e stai andando al blocco catch. Ma se il logger fallisce in primo luogo, lo farebbe in secondo luogo. Se uno prende il tuo percorso, dovresti scrivere una quantità infinita di try-catch se vuoi assicurarti che uno dei logger generi un'eccezione e anche una quantità infinita di logger.

Il tuo secondo approccio è fuorviante come altri hanno scritto.

Anche se ha senso farlo nel primo modo: ma con diversi livelli di registro:

try
    do x
    log.info('operation successful')
catch
    log.error('something went terribly wrong') #or log.warn()
end

Ma c'è un altro paradigma di programmazione, che è utile: link Con AOP puoi separare meglio le tue preoccupazioni.

    
risposta data 13.08.2014 - 22:08
fonte

Leggi altre domande sui tag