Catching Exception e Richiamo della stessa funzione?

1

Ho una funzione che invia dati al server di una terza parte usando una libreria che hanno fornito. La funzione è molto semplice. Richiede solo un elenco di oggetti da inviare, scorre attraverso ogni elemento dell'elenco e chiama la funzione della libreria di terze parti per caricare un oggetto. Il problema che sto incontrando è che la mia lista di oggetti è abbastanza grande (~ 22.000 voci, anche se ciascuna voce è di circa 240 byte, quindi solo ~ 5 MB in totale), e ottengo sempre eccezioni in parte attraverso il caricamento della lista.

Ricevo una varietà di errori, in genere errori interni del server, ma anche errori relativi a pezzi mancanti al livello in cui la loro libreria funziona.

Una soluzione che ho appena scritto (e testato e ha funzionato!) è di rilevare qualsiasi eccezione durante il processo di caricamento, e quindi di richiamare la mia funzione di upload, ma di passare solo gli oggetti nella mia lista che non l'hanno fatto attraverso il processo di caricamento ancora.

Questo ha funzionato quando l'ho testato, anche se ha catturato undici eccezioni prima di completare le mie 22.000 voci. Qualcosa su come scrivere codice in questo modo mi fa sentire un violentatore.

Ho un paio di idee per migliorare la gestione delle eccezioni:

  • Catch solo alcune eccezioni - Ho visto solo tre o quattro diverse eccezioni. Se limito il mio pescato a quegli stessi tre o quattro, il programma sarà più prevedibile (non catturerò qualcosa di non correlato come una connessione di rete persa alla mia estremità, e cercherò di continuare a inviare i miei dati)
  • Limita il numero di volte in cui tento di richiamare la mia funzione di caricamento - Supponendo che il loro server sia inattivo, potrei finire in un ciclo infinito. Se lo limito per dire 50 o 100 tentativi, dovrebbe sperare di essere molto più del necessario.

Esiste una best practice standard per questo tipo di situazione? È un abuso di eccezioni?

    
posta WhiteHotLoveTiger 20.05.2016 - 14:39
fonte

2 risposte

2

Something about writing code this way makes me feel like an abuser.

Non capisco, perché ti senti così. Ecco come è la vita (in un sistema distribuito): hai un lavoro e cerchi di fare del tuo meglio per farlo. Quando la controparte fallisce per qualsiasi motivo, non è colpa tua.

Quello che dovresti fare è fare il tuo lavoro in modo sano , cioè definire in quali circostanze ripetere il tuo lavoro e come gestire il fallimento.

Il Pattern più comune per far fronte a questa situazione è il Circuit Breaker tratto dal prenota Rilasciarlo di Michael T. Nygard.

Un Interruttore funge da mediatore tra i sistemi di sistema (interno) e straniero (esterno). Un interruttore automatico si occupa di riprovare e controllare i guasti.

Supponendo di incorporare un interruttore di circuito per la stampante locale , si consegnerà ogni lavoro di stampa a un interruttore automatico, che accoda un determinato numero di lavori di stampa e li invia uno alla volta alla stampante. Se la stampante non risponde per un breve periodo di tempo, l'interruttore riproverà a inviare i dati. Se viene raggiunto un determinato limite, l'interruttore automatico non accetta ulteriori lavori di stampa a meno che non venga reinserito un determinato stato.

    
risposta data 20.05.2016 - 22:25
fonte
1

Come altri hanno detto, riprovare dopo un'eccezione (rara) va bene. Ma passerei un po 'di tempo a verificare se un caricamento fallito garantisce un'eccezione; se non hai bisogno di un modo per verificare quali caricamenti hanno funzionato.

    
risposta data 20.05.2016 - 19:37
fonte

Leggi altre domande sui tag