我正在创建一个3层应用程序,我在处理错误处理时遇到问题。我不知道是否应抛出异常或调用方法将问题传达给其他层。
这是一个快速的例子,我有:
- FileChooserFrame
(表示层),允许用户选择列表中的文件
- DataHandler
(应用层),它使用文件的路径做一些事情,并在Presentation& amp;和数据层。
- 一个FileParser
(数据层),用于解析文件并从中获取数据。
现在让我们说文件必须遵循一个特殊的结构,如果不是,我想显示一个MessageBox。
在解析之前,我无法知道用户是否选择了一个好的文件。
我的问题是,当我发现文件没有遵循结构时,我该怎么办?
我想到了两件事:
1 - 停止当前操作并调用DataHandler
(例如NotifyWrongFileErr()
)中要求框架显示messageBox的方法。
2 - 抛出我在FileChooserFrame
中捕获的自定义异常,它将显示弹出窗口。
这两种情况都有其优点/缺点所以我无法在它们之间做出选择。什么是最合适的事情?
PS:如果是n°2,我在哪里编写Exception类?在专门用于应用程序的例外的文件中,或者在将要抛出它的类旁边的文件中?
答案 0 :(得分:4)
这是你的选择,有例外的最佳做法通常是在你没想到的情况下抛出异常。由于您希望某人能够选择无效的文件名,因此调用该方法可能被视为“最佳做法”。但是,只要你满意,就没有对错,做你喜欢的事。如果是我,我会为这样的事情创建一组数据层异常并抛出它们,这样如果我想用一些测试代码(IoC)测试数据teir,我会看到异常。
答案 1 :(得分:1)
如果"期望",该用户可能有无效输入,并且有标准响应,在这种情况下不需要例外。它是数据处理的一部分。只需确保在验证失败时执行所有必要的清理。
答案 2 :(得分: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
}
}
这显示了与事件的异常有多么不同,主要是由于第一个的错误/故障相关情况。 另一方面,您有方法,但我认为事件由于其委托系统或动态绑定工具而更加灵活。
在我看来,避免逻辑的自定义异常,没人知道你何时在代码中放入了Exception,并且没有人知道它何时会在某些应用程序失败时转换。
看看WPF处理和路由事件的方式,它会帮助你MSDN
答案 3 :(得分:0)
从性能的角度来看,生成异常更昂贵,而不是要求框架显示messageBox