Noto spesso, in applicazioni layered a 3 (o più) livelli, si nutrono dubbi su come gestire le eccezioni che si verificano durante l'accesso alla fonte dati.
Che fare?
Intercetto l'eccezione e la faccio risolvere al DAL ritornando un codice di errore verso il chiamante? Non intercetto l'eccezione e lascio che sia lo strato di business ad interessarsi della cosa? Intercetto l'eccezione e la rilancio al chiamante?
Ho provato varie strade, ho anche fatto una chiacchierata con Andrea, e insieme a lui, e il modo che preferisco per gestire il bubbling delle eccezioni è il seguente (IMVHO):
1) Nel DAL intercetto le eccezioni scatenate dalla fonte dati (tipicamente SqlException), eventualmente loggo e genero una mia eccezione di tipo MyDalException
2) Nel BL intercetto MyDalException e ancora una volta genero un'eccezione di tipo MyBLException facendola risalire fino all'interfaccia che si occuperà di notificare all'utente il problema
Naturalmente non è detto che l'eccezione vada sempre sollevata, ci possono essere casi in cui il DAL o il BL riescono a risolvere il problema senza passarla allo strato superiore.
Altra questione che può nascere è: ma nel rigenerare la nuova eccezione dal DAL uso la proprietà InnerException e la imposto alla SqlException che ho intercettato?
La risposta è no, perchè agli strati superiori non serve e nel caso in cui servisse si creerebbe accoppiamento tra lo strato dati e lo strato business (grave errore).