Diciamo che ho un'interfaccia che descrive un semplice servizio
public interface AccountService
{
public int getUserId(String userName) throws UserNotFoundException;
//...
}
Ho scritto io stesso l'eccezione UserNotFoundException
ed è specifico per questo servizio. Oltre a ciò, qualsiasi altra cosa che potrebbe andare storta è l'implementazione specifica.
Se ho un
public class DatabaseAccountService
{
@Override
public int getUserId(String userName) throws UserNotFoundException
{
//some stuff that might throw an SQLException
}
}
La connessione potrebbe essere interrotta, la tabella non potrebbe esistere, ecc.
Mentre con FileAccountService
invece, il file potrebbe avere problemi di autorizzazione, potrebbe esistere ma essere in un formato non valido, ecc. Potrebbero verificarsi molti problemi specifici di implementazione in entrambi i casi.
Il fatto è che non posso descrivere tutti i possibili problemi di tutte le possibili implementazioni nella mia interfaccia. Ho bisogno in qualche modo di descrivere "cose che sono andate storte e sono specifiche dell'implementazione". Dovrei avvolgere tali eccezioni in RuntimeException
o aggiungere un'altra eccezione alla mia firma come OperationFailedException
?
Racchiudere l'eccezione specifica dell'implementazione in UserNotFoundException
non è nemmeno un'opzione. Sarebbe bugiardo, potenzialmente dicendo che un utente non esiste mentre il file potrebbe non essere leggibile.
Il problema che vedo con RuntimeException
s è che potrebbero non essere catturati dall'utente, forse portare a un arresto anomalo dell'applicazione quando forse c'era qualcosa di meglio da fare.
Il problema che vedo con un OperationFailedException
è che è super generico e non aggiunge alcuna informazione ai miei metodi firme.
public interface AccountService
{
public int getUserId(String userName) throws UserNotFoundException,
OperationFailedException; //dumb, any method can fail
}
Inoltre, mi sento come se aggiungere OperationFailedException
fosse la cosa migliore da fare, un tipo generico di wrapping di eccezioni esisterebbe nella libreria standard. Tuttavia, per quanto ne so, tale eccezione generica non esiste, suggerendo che ogni eccezione dovrebbe essere il più specifica possibile per aiutare i programmatori.
Ho qualche altra opzione? Qual è il migliore se voglio che qualcuno ecceda tanto dal mio codice che dalla libreria standard Java?