错误处理:异常与错误方法

时间:2013-05-21 13:42:48

标签: c# oop error-handling 3-tier

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

这是一个快速的例子,我有:
  - FileChooserFrame(表示层),允许用户选择列表中的文件   - DataHandler(应用层),它使用文件的路径做一些事情,并在Presentation& amp;和数据层。
  - 一个FileParser(数据层),用于解析文件并从中获取数据。

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

我的问题是,当我发现文件没有遵循结构时,我该怎么办? 我想到了两件事:
1 - 停止当前操作并调用DataHandler(例如NotifyWrongFileErr())中要求框架显示messageBox的方法。
2 - 抛出我在FileChooserFrame中捕获的自定义异常,它将显示弹出窗口。

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

PS:如果是n°2,我在哪里编写Exception类?在专门用于应用程序的例外的文件中,或者在将要抛出它的类旁边的文件中?

4 个答案:

答案 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

相关问题