代码之家  ›  专栏  ›  技术社区  ›  Matt_JD

可能有多个异常顺序

  •  1
  • Matt_JD  · 技术社区  · 15 年前

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

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

    void Compress(string dirPath, string filePath);
    

    我还没有写这个函数,我正在进行测试。

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

    我考虑了一些方法来解决这个问题,比如总是基于从左到右的参数处理抛出,或者声明“如果dirPath无效,则抛出X,否则抛出X,如果filePath无效,则抛出Y”,并将其与接口定义放在一起,以便实现它的人(希望)应该遵循这个规范。

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

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   aschepler    15 年前

    我不说了。文件可以说:

    可能的异常包括:如果dirPath无效,则为X;如果filePath无效,则为Y。

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

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

        2
  •  2
  •   Paul Sonier    15 年前

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

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