2

我正在创建一个 3 层应用程序,但在处理错误处理时遇到了问题。我不知道是否应该抛出异常或调用方法将问题传达给其他层。

这是一个简单的例子,我有:
- 一个FileChooserFrame(演示层),允许用户在列表中选择一个文件。
- 一个DataHandler(应用层),它对文件的路径做一些事情,并在演示层和数据层之间建立链接。
-FileParser解析文件并从中获取数据的(数据层)。

现在假设文件必须遵循特殊结构,如果不是,我想显示一个 MessageBox。
我无法知道用户在解析之前是否选择了一个好的文件。

我的问题是,当我看到文件不符合结构时我该怎么办?
我想到了两件事:
1 - 停止当前操作并调用DataHandler(例如NotifyWrongFileErr())中的一个方法,该方法将要求框架显示消息框。
2 - 抛出一个自定义异常,我在FileChooserFrame其中将显示弹出窗口。

这两种情况都有其优点/缺点,所以我无法在它们之间做出选择。最合适的做法是什么?

PS:在第 2 种情况下,我在哪里编写 Exception 类?在专用于应用程序异常的文件中,还是在抛出它的类旁边?

4

4 回答 4

4

好吧,这是您的选择,异常的最佳实践通常是仅在您没有预料到的情况下抛出异常。由于您希望一个人能够选择无效的文件名,因此调用该方法可能被认为是“最佳实践”。但同样,没有对错,只要你对它感到高兴,就做你喜欢的事。如果是我,我会为这样的事情创建一组数据层异常并抛出它们,这样如果我想使用一些测试代码 (IoC) 测试数据层,我会看到异常。

于 2013-05-21T13:50:44.227 回答
1

如果它是“预期的”,则该用户可能有无效输入,并且对此有标准响应,在这种情况下不需要例外。它是数据处理的一部分。只要确保在验证失败时执行所有必要的清理工作。

于 2013-05-21T13:49:18.153 回答
1

那么事件处理系统呢?

异常处理需要一个 try/catch/throw 结构,该结构可以以昂贵的方式在您想要的任何地方“冒泡”事件。但是,如果您从 DataHandler 中处理的 FileParser 触发一个事件(或在表示层顶部冒泡),您可以将每个模块与其他模块分离。

一个小例子(假设 DataHandler 层“知道” FileParser 层):

class FileParser
{
public event EventHandler ParsingFailedEvent;

public void ParseFile()
{
// 1. Parse the file
// 2. File structure isn't correct, raise event!

            ParsingFailedEvent.Invoke(sender, e);
}

}

class DataHandler
{
private FileParser fp = new FileParser();
public DataHandler()
{

            fp.ParsingFailedEvent+= new EventHandler(this.FileParsingHandler);
}

public void FileParsingHandler(object sender, EventArgs e)
        {
// do something, maybe display a MessageBox
}

}

这向您展示了事件中的异常有多么不同,主要是由于第一个事件的错误/故障相关条件。另一方面,您有方法,但我认为事件由于它们的委托系统或动态绑定工具而更加灵活。

在我看来,避免逻辑的自定义异常,没有人知道你什么时候在你的代码中放置一个异常,也没有人知道它什么时候会在某些应用程序失败中转换。

看看 WPF 方法来处理和路由事件,它将帮助你MSDN

于 2013-05-21T14:20:38.023 回答
0

从性能的角度来看,生成异常比要求框架显示消息框更昂贵

于 2013-05-21T14:12:08.573 回答