Vorrei iniziare con Linee guida di progettazione per le eccezioni il suo breve e include DO, DO NOT e EVITARE. Dà anche i motivi per cui.
Nel tuo caso di esempio la sezione del revelvent sarebbe Wrapping Exceptions
E si aspetterebbe che fosse scritto in questo modo. Si noti che rileva un'eccezione specifica e tenta di aggiungere informazioni in modo da propagare un messaggio più significativo. Si noti inoltre che l'eccezione interna viene ancora mantenuta per scopi di registrazione
//In DataLayer
try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
throw new TransactionFileMissingException(
"Cannot Access System Information",ex);
}
Aggiorna
Kanini chiede che sia anche giusto avere questo blocco di eccezioni nel livello dati o il controllo che il file sia disponibile per Business Layer.
Innanzitutto vorrei sottolineare che la logica di Wrapping Exceptions è questa
Consider wrapping specific exceptions
thrown from a lower layer in a more
appropriate exception, if the lower
layer exception does not make sense in
the context of the higher-layer
operation.
Quindi, se ritieni che un livello superiore debba conoscere il file, il tuo livello dati dovrebbe apparire come questo
//In DataLayer
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
No Try No Catch.
Personalmente ritengo che a meno che il tuo livello dati non faccia qualcosa di utile come usare un sistema.xml predefinito che è una risorsa di assemblaggio, non fare nulla o avvolgere l'eccezione è una buona scommessa dato che la tua registrazione ti dirà quale metodo e quale file era il problema. ( throw ex
in questo caso o anche il preferito throw
lo fa ma non aggiunge alcun valore). Ciò significa che una volta identificato sarai in grado di risolvere rapidamente il problema.
Come parte di questo esempio particolare ha anche il seguente problema in quanto XDocument.Load può lanciare quattro execeptions
- ArgumentNullException
- SecurityException
- FileNotFoundException
- UriFormatException
Non possiamo garantire in modo sicuro che il seguente codice non getti e FileNotFoundException, semplicemente perché potrebbe esserci quando eseguiamo il controllo dell'esistenza e scompaiono quando vengono caricati. Avere quello disponibile per il livello aziendale non sarebbe di aiuto.
if (File.Exists("systems.xml"))
XDocument.Load("systems.xml");
SecurityException è anche peggio perché, tra le altre ragioni per cui viene lanciata se un altro processo ha un blocco di file esclusivo, non otterrai l'errore finché non provi ad aprirlo per la lettura perché non esiste un metodo File.CanIOpenThis () . E se questo metodo esistesse hai ancora lo stesso problema con File.Exists