Best practice per la gestione di molte eccezioni

-1

Dispongo di un microservizio Java che espone più API. Sotto ogni API ci sono molte eccezioni che potrebbero essere lanciate. L'ultimo metodo che li cattura tutti ha un grosso blocco catch ...

catch(exc1 e1 | exc2 e2 | exc3 e3 ..... | exc10 e10){ ...}

Sono tutti dello stesso livello. Ora pensavo di unirli tutti sotto un'unica eccezione. Quindi, exc1 a exc10 estendono Api1Exception . Quindi potrei prenderlo in questo modo:

catch(Api1Exceptione){ ... }

Più pulito e più facile da controllare. Però. Ho realizzato che altre API condividono alcune di Api1Exception eccezioni. Diciamo API2, sta lanciando qualcosa come:

catch(exc13 e13 | exc2 e2 | exc16 e16 ..... | exc19 e19){ ...}

Non voglio catturare l'intero Api1Exception , perché alcuni di essi non vengono lanciati in quella logica API2. Quindi, ho dovuto creare un'altra eccezione Api2Exception e ho creato un'altra copia di say exc2 per essere un figlio di Api2Exception . Questo per me sembra un codice ridondante, e ho pensato che ci dovrebbe essere un modo migliore per gestire questo. Qualche idea?

UPDATE

Seguendo la risposta, questo è quello che ho fatto:

  • creato CustomException che estende Exception , con campo errorCode
  • Ogni eccezione personalizzata che creo, estende CustomException e passa il errorCode insieme a message
  • Lo prendo in questo modo:

    catch(CustomException ce){    
        handleCustomException(ce)    
    }
    
  • metodo di gestione:

    if(ce.getErrorCode().eqauls(SOME_ERROR_CODE){    
            //do something    
    }    
    else if (ce.getErrorCode().eqauls(SOME_ERROR_CODE){    
            //do something else    
    }    
    //.......    
    else{    
         throw new Exception ....    
    }    
    

P.S. : Non sono sicuro del motivo per cui la mia domanda è stata downvoted. Chiunque l'abbia fatto, sarebbe fantastico se fornissi un feedback.

    
posta Hawk 30.05.2018 - 01:10
fonte

1 risposta

8

L'approccio standard consiste nel creare una classe ApiException generata da tutte le API pubbliche della libreria e racchiudere l'eccezione sottostante :

try {
}
catch (Exception e) {
    throw new ApiException(e);
}

Se il blocco catch di un utente richiede una gestione speciale per alcune delle eccezioni sottostanti, esso può scartarlo (con .getCause() ) e se non è ciò che è necessario, rilancia l'eccezione originale.

L'idea è che se ci sono tutti i tipi di possibili cause sottostanti non correlate alla logica del codice, il codice non può fare nulla di intelligente al riguardo, e questo richiede piuttosto l'intervento dell'amministratore dell'app. Quindi lo passa semplicemente a monte, eventualmente avvolgendolo con un proprio tipo, con l'idea che alla fine verrà registrato.

Se si suppone che il codice sia effettivamente in grado di risolvere il problema, la funzione dovrebbe restituire eccezioni concrete che sono in linea con la natura del suo lavoro, e non più di alcune di questi. Se non si riesce a mantenere il numero piccolo in questo caso, probabilmente è necessario dividere la funzione in alcuni più specializzati che l'utente chiamerà in sequenza.

    
risposta data 30.05.2018 - 07:08
fonte

Leggi altre domande sui tag