我将从“例外的设计准则”开始,它包括DO,DO NOT和AVOID。它还给出了原因。
在您的示例案例中,revelvent部分将是Wrapping Exceptions
并希望它是这样写的。请注意,它捕获特定的异常并尝试添加信息,以便传播更有意义的消息。另请注意,内部异常仍保留用于日志记录
//In DataLayer
try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
throw new TransactionFileMissingException(
"Cannot Access System Information",ex);
}
UPDATE
Kanini询问在数据层中具有此异常块是否正确,或者检查文件是否可用于业务层。
首先,我想指出,包装异常的理由是
如果较低层异常在高层操作的上下文中没有意义,请考虑将从较低层抛出的特定异常包装在更合适的异常中。
因此,如果您认为更高层应该完全了解文件,那么数据层应该像这样
//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相同的问题。