Я б розпочав із коротких рекомендацій щодо дизайну для виключень і включає в себе ДО, НЕ та уникай Це також дає причини, чому.
У вашому прикладі випадком розділ, який сподобається, буде обгортанням винятків
І сподівався б, що це буде написано так. Зауважте, що він ловить конкретний виняток і намагається додати інформацію, щоб поширити більш змістовне повідомлення. Також зауважте, що внутрішній виняток все ще зберігається для ведення журналу
//In DataLayer
try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
throw new TransactionFileMissingException(
"Cannot Access System Information",ex);
}
ОНОВЛЕННЯ
Каніні запитує, чи правильним є цей блок виключень у рівні даних даних або чи слід перевіряти файл, доступний для бізнес-рівня.
Ну, спершу я хотів би зазначити, що обґрунтування винятку є виключенням
Розглянемо обгортання конкретних винятків, викинутих із нижнього шару, на більш підходящий виняток, якщо виняток із нижнього шару не має сенсу в контексті операції вищого рівня.
Тож якщо ви вважаєте, що у вас є більш високий рівень, ви повинні взагалі знати про файл, тоді ваш рівень даних повинен виглядати так
//In DataLayer
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
Не намагайся не ловити.
Особисто я відчуваю, що якщо ваш рівень даних не може зробити щось корисне, як, наприклад, використовувати систему default.xml, що є ресурсом збирання, нічого не роблячи або обговорюючи виняток, це хороша ставка, оскільки ваш журнал підкаже, який метод і який файл був проблемою. ( throw ex
у цьому випадку або кращий також throw
робить, але значення не додає). Це означає, що виявивши проблему, ви зможете швидко виправити проблему.
В якості підтвердження цього конкретного прикладу також є наступна проблема в тому, що XDocument.Load може кинути чотири виконавці
- ArgumentNullException
- SecurityException
- FileNotFoundException
- UriFormatException
Ми не можемо з впевненістю гарантувати, що наступний код не буде викинутим і FileNotFoundException, просто тому, що він може бути там, коли ми перевіряємо існування і зникаємо, коли ми завантажуємо. Наявність цього доступного для бізнес рівня не допоможе.
if (File.Exists("systems.xml"))
XDocument.Load("systems.xml");
SecurityException ще гірше, тому що серед інших причин цього викидається, якщо інший процес захоплення має ексклюзивне блокування файлів, ви не отримаєте помилку, доки не спробуєте відкрити її для читання, оскільки немає методу File.CanIOpenThis (). І якщо такий метод існував, у вас все ще є та сама проблема, що і з File.Exists