以下哪种方法可以更好地处理这个前提条件,有哪些更重要的含义?
1:
If Not Exists(File) Then
ThrowException
Exit
End If
File.Open
...work on file...
2:
If Exists(File) Then
File.Open
....work on file...
Else
ThrowException
Exit
End
注意:文件存在检查只是HANDLE的前提条件的一个示例。显然,有一个很好的例子,让文件存在检查向上抛出自己的异常。
答案 0 :(得分:4)
我更喜欢第一个变体,因此更好的文档有前提条件
答案 1 :(得分:2)
将前置条件检查与工作分开只有在两者之间没有任何变化时才有效。在这种情况下,外部事件可能会在您打开文件之前删除该文件。因此,对文件存在的检查几乎没有价值,无论如何,open调用必须检查它,让它产生异常。
答案 2 :(得分:1)
这是一种风格的东西。两者都运作良好,但我更喜欢选项1.我喜欢尽快退出我的方法并预先进行所有检查。
答案 3 :(得分:1)
可读性高于第二种方法 如果你有几个先决条件要检查,第二个选项可以很快地嵌套;而且,它表明if / else在某种程度上处于正常流程中,而它实际上仅适用于特殊情况。
因此,第一种方法的表现力因此高于第二种方法 当我们谈论前提条件时,应该在程序开始时检查它们,以确保合同得到尊重;因此,整个检查应该以某种方式与程序的其余部分分开。
出于这两个原因,我肯定会选择第一个选项。
注意:我在这里谈论前提条件:我希望你的函数的契约明确地将文件定义为现有文件,因此没有它会成为编程错误的标志。
否则,如果我们只是讨论异常处理,我只是将它留给File.Open,只有在知道如何继续处理时才处理该异常。
答案 4 :(得分:1)
必须在适当的级别生成每个例外。在这种情况下,您的异常是open()问题,由open()调用处理。因此,您不应该在例程中添加异常代码,因为您会复制内容。这除非:
至于你的两个案例的编码风格,我肯定会选择第一个。我讨厌长代码块,特别是在ifs下。他们也倾向于嵌套,如果你选择第二种策略,你最终会缩进。
答案 5 :(得分:1)
真正的前提条件是一种情况,如果发生的话,是调用者情况下的错误:你在某些条件下设计了一个函数但它们没有被保留,所以调用者永远不应该用这些数据调用函数。
如果文件是必需的并且之前在代码的另一部分中检查了它的存在,那么您找不到文件的情况可能是这样的;但是,情况并非如此,正如djna所说:文件删除或网络故障可能会在您打开文件时发生错误。
最常见的处理是尝试打开文件,并在失败时抛出异常。然后,假设没有抛出异常,继续正常工作。