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:
- 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. - Se le altre eccezioni non estendono
MyAppException
, dovrebbeMyAppException
essere unjava.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 catturaMyAppException
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.