Exception 可能出现多个异常时的异常顺序

Exception 可能出现多个异常时的异常顺序,exception,testing,interface,Exception,Testing,Interface,如果一个函数有两个参数,并且两个参数都产生异常,那么将以什么顺序引发它们,并在何处定义它 这是在我为一个函数编写测试时出现的,该函数将获取磁盘上的目录并将其压缩到文件中。例如: void Compress(string dirPath, string filePath); 我还没有编写函数,我正在进行测试 问题是,如果目录路径不存在,我会抛出一个丢失目录的异常,如果文件有写权限,我会抛出一个异常来显示这一点。但是,如果两条路径都会导致异常呢?我会抛出第一个,第二个,第三个,还是一个未知状态?我

如果一个函数有两个参数,并且两个参数都产生异常,那么将以什么顺序引发它们,并在何处定义它

这是在我为一个函数编写测试时出现的,该函数将获取磁盘上的目录并将其压缩到文件中。例如:

void Compress(string dirPath, string filePath);
我还没有编写函数,我正在进行测试

问题是,如果目录路径不存在,我会抛出一个丢失目录的异常,如果文件有写权限,我会抛出一个异常来显示这一点。但是,如果两条路径都会导致异常呢?我会抛出第一个,第二个,第三个,还是一个未知状态?我们也曾考虑过用一个例外来表示“有东西坏了”,但在每种情况下,信息都会有所不同,因此没有真正的帮助

我已经想到了一些解决方法,比如总是基于从左到右的参数处理进行抛出,或者声明“如果dirPath无效,则抛出X,否则如果filePath无效,则抛出Y”,并将其与接口定义一起放置,以便实现它的人(希望)遵循此规范

只是想知道人们会采取什么方法来解决这个问题


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

我不想说明它。文件可以说:

可能的例外情况包括:如果dirPath无效,则为X;如果文件路径无效,则为Y

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


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

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


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

我认为这主要是首选项,但如果是我,我会按照最符合逻辑的顺序抛出。在这种情况下,您想压缩一个文件夹,所以首先要查找该文件夹,如果它有问题,您不应该关心目标文件是否有问题,因为您甚至都无法访问该文件夹。@kylep:完全同意;请看我的答案。这是我考虑过的另一个选项,但是这种方法有两个问题:一个问题是我们的单元测试内容不允许出现多个可能的异常(尽管这是可以修复的)。另一个问题是,对于可以返回相同输入的this或than的代码,我感到有点不舒服。我想我更喜欢指定顺序。虽然我对它不太满意,但这是我在与同事讨论后选择的。我们之所以得出这个结论,是因为我们不能完全控制异常抛出的顺序。然而,这和McWafflestix的回答都对我有所帮助。谢谢