Я бы начал с краткого руководства по проектированию исключений, которое включает в себя DO, NOT и AVOID. Это также дает причины почему.
В вашем примере, раздел revelvent будет Wrapping Исключения
И ожидал, что это будет написано так. Обратите внимание, что он перехватывает конкретное исключение и пытается добавить информацию для распространения более значимого сообщения. Также обратите внимание, что внутреннее исключение все еще сохраняется для целей регистрации
//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");
Не пытайся, не лови.
Лично я чувствую, что если ваш уровень данных не может сделать что-то полезное, например, использовать стандартный файл systems.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