多个可能时的例外顺序

时间:2010-11-15 19:28:18

标签: exception testing interface

如果一个函数有2个参数并且都产生异常,那么你将它们引入的顺序是什么顺序以及你在哪里定义它?

当我为一个函数编写测试时会出现这种情况,该函数会将磁盘上的目录压缩并压缩到一个文件中。例如:

void Compress(string dirPath, string filePath);

我还没有编写这个功能,我正在进行测试。

问题是,如果目录路径不存在,我会抛出一个丢失目录的异常,如果文件具有写入权限,我会抛出异常来显示。但是,如果两条路径都会导致异常怎么办?我会抛出第一个,第二个,第三个,还是未知状态?我们还考虑过一个例外,说“Something broken”,但每个案例的信息都不同,所以没有真正的帮助。

我已经考虑了一些方法,比如总是根据从左到右处理参数进行投掷,或者声明“如果dirPath无效则抛出X,否则如果filePath无效则抛出Y”并放置使用接口定义,以便任何实现它的人都应该(希望)遵循此规范。

只是想知道人们会对这个问题采取什么方法。

作为参考,这是在C#中,但我认为这不是特定于语言的问题。

2 个答案:

答案 0 :(得分:2)

确定异常顺序时,应确定故障的逻辑顺序。因此,在您的示例中,如果目录不存在且不允许文件写入权限,则在尝试创建目标文件之前,期望您的代码首先检查目录是否存在并不合理;因此,应该从代码中抛出该异常,该代码将检查目录是否存在,这将首先完成。

当然,如果您有更改操作顺序的特定原因(首先创建写入文件,然后检查源目录),那就完全没问题;但重点是,任一路径都会抛出异常,这表明SOMETHING操作出错了;调用代码如何处理它取决于调用代码。如果你想捕获一种类型的可恢复异常(例如fileintwritable)并专门处理它,然后只是为其他一切捕获一般异常,那很好;您的应用程序应该定义它考虑和处理被调用代码异常的协议。

答案 1 :(得分:1)

我会留下未指明的。文档可以说:

  

可能的例外包括:如果dirPath无效,则为X;如果filePath无效,则为Y.

如果单元测试中两者都无效,只要抛出两个异常中的任何一个,它就可以通过。

因为实际上,当存在多个异常值得问题时,实际上取决于发生异常的任何事情都不是一个好主意。