Progettazione della gerarchia delle eccezioni

7

Nella mia azienda stiamo costruendo una webapp contenente servizi centrali server che progettiamo noi stessi e quindi specificiamo come interfacce. Cioè le interfacce sono specifiche dell'applicazione e vengono quindi implementate con librerie di terze parti che possono cambiare nel tempo. Quando si tratta di eccezioni, mi sono reso conto che le eccezioni generate dai nostri servizi dovrebbero essere le nostre eccezioni specifiche per l'applicazione rispetto alle eccezioni specifiche dell'implementazione.

Ora mi chiedo in che modo le nostre eccezioni dovrebbero essere strutturate e correlate l'una con l'altra.

Per prima cosa, considera un'eccezione generica MyAppException . Questa eccezione indica che qualcosa di inesplorato è andato storto e la cosa migliore che possiamo fare è visualizzare un messaggio all'utente che dice che qualcosa è andato storto e che stiamo lavorando su di esso. L'errore potrebbe essere che il database si è arrestato in modo anomalo o qualcosa di simile. Questa eccezione verrebbe praticamente generata da tutti i metodi che funzionano con il database.

In secondo luogo, considera un'eccezione MyAppDuplicateException . Questa eccezione indica che l'utente ha provato a salvare qualcosa nel database che era già presente. Qui, possiamo visualizzare un messaggio di errore molto più specifico e questa eccezione viene generata solo dai metodi che inseriscono o aggiornano le righe del database.

L'applicazione può contenere anche altre eccezioni simili a MyAppDuplicateException per altre situazioni di errore estrapolato. Ex MyAppNotFoundException etc ...

Ora per le mie domande:

  1. Le altre eccezioni dovrebbero estendere MyAppException ? In realtà non vedo alcuna ragione per questo, l'ho appena visto in molti posti e mi chiedo se c'è uno scopo. Il lato negativo di questo, a quanto vedo, è che una dichiarazione try / catch non ha bisogno di preoccuparsi dell'eccezione specifica in questo caso. Può solo catturare l'eccezione principale e per questo non ha bisogno di gestire l'errore specifico che era praticamente il punto di avere l'eccezione specifica.
  2. Se le altre eccezioni non estendono MyAppException , dovrebbe MyAppException essere un java.lang.RuntimeException ? Ciò non richiederebbe l'esecuzione di codice per catturarlo, cosa che a me sembra naturale poiché il punto dell'eccezione è dire che è successo qualcosa di sconosciuto e il codice di esecuzione non è previsto per essere in grado di gestirlo. Il codice nel punto di ingresso della richiesta potrebbe ancora avere un'istruzione try / catch che cattura MyAppException e si assicura che un messaggio venga visualizzato all'utente.

modifica Non ci sono dubbi sul fatto che le eccezioni specifiche come MyAppDuplicateException debbano essere controllate o meno, dovrebbe essere controllato in modo definitivo.

    
posta Ludwig Magnusson 29.05.2012 - 12:30
fonte

2 risposte

8
  1. A volte vuoi catturare un tipo specifico di eccezione (ad esempio MyAppDuplicateException ) ea volte vuoi catturare un'intera categoria di eccezioni (ad esempio MyAppException ). Con MyAppDuplicateException estendi MyAppException stai dando al codice chiamante un po 'più di flessibilità nel modo in cui gestisce le diverse eccezioni.
  2. Il miglior consiglio che ho sentito su questo è che in generale dovresti lanciare un'eccezione controllata se qualsiasi cosa chiamata il tuo metodo ha obbedito al suo contratto. È un modo per dire "ecco le cose che ci si potrebbe aspettare che falliscano". Definirei sicuramente MyAppDuplicateException e le eccezioni controllate come ( non RuntimeException s).

C'è un ottimo articolo qui che dovrebbe aiutarti a evitare la maggior parte delle insidie più comuni.

    
risposta data 29.05.2012 - 13:34
fonte
1

I have realized that the exceptions thrown by our services should be our own application-specific exceptions as opposed to implementation specific exceptions.

Con questo intendi le eccezioni definite dall'implementazione di terze parti? Corretta?

First, consider a generic exception MyAppException. This exception indicates >that something unexcpected went wrong and the best thing we can do is to >display a message to the user saying that something went wrong and that we are >working on it. The error could be that the database crashed or something >similair. This exception would pretty much be thrown from all methods working >with the database.

Se questo tipo di eccezione rappresenta un errore nel tuo programma che non è causato da un brutto input da parte dell'utente, ma piuttosto da un problema con il tuo codice, allora in Java dovrebbe essere un'eccezione di runtime.

Secondly, consider an exception MyAppDuplicateException. This exception would >indicate that the user tried to save something into the database that was >already there. Here, we can display a much more specific error message and this >exception is only thrown from the methods that inserts or updates database >rows.

Questa è un'eccezione controllata in Java.

If the other exceptions does not extend MyAppException, should MyAppException >be a java.lang.RuntimeException?

Sì.

This would not require executing code to catch it, which to me sounds natural >since the point of the exception is to say that something unknown happened and >the executing code is not excpected to be able to handle it. The code at the >entry point of the request could still have a try/catch statement that catches >MyAppException and makes sure that a message is displayed to the user.

Sì, è vero.

    
risposta data 29.05.2012 - 13:50
fonte

Leggi altre domande sui tag