Sto parlando in base all'esperienza con Java e C #. Non so se un'altra lingua abbia un'implementazione di gestione delle eccezioni diversa.
Per ottenere un accoppiamento lento, abbiamo bisogno che il nostro codice sia programmato per usare l'astrazione piuttosto che l'implementazione. Tuttavia, il caso di gestione delle eccezioni è il contrario. La best practice è che devi gestire un tipo di eccezione specifico ( SqlException
, StackOverflowException
, ecc.)
Questa cosa potrebbe essere migliore (o meno) in java grazie per il suo Checked Exception
, c'è una specie di "contratto" tra l'interfaccia e il consumatore. Ma in C # o per Unchecked Exception
non c'è un contratto su quale eccezione può essere lanciata dall'interfaccia.
Ad esempio, supponiamo di utilizzare Repository Pattern
per disaccoppiare DAL con BLL. L'eccezione di cattura semplice di solito si usa come:
public void Consume()
{
try{
productRepository.Get(k=>k.Id == "0001");
}
catch(Exception e){
// handle
}
}
Nel caso più specifico usiamo solitamente SqlException
. Tuttavia significa che dobbiamo sapere che ProductRepository
è un repository sul server di database. Cosa succede se l'implementazione è stata modificata per utilizzare invece il repository di file? Ora devi prendere FileNotFoundException
o qualcosa del genere.
Perché viola il principio del "codice per l'astrazione"? E cosa possiamo fare per impedirlo?