Python:递归函数中的错误处理

2024-10-01 17:36:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我:我运行的是python2.3.3,没有升级的可能,而且我对Python没有太多的经验。我的学习方法是在谷歌上搜索和阅读大量的stackoverflow。在

背景:我正在创建一个python脚本,它的目的是将两个目录作为参数,然后对这两个目录中找到的所有文件执行比较/diff。目录有子目录,这些子目录也必须包含在diff中。 每个目录是一个列表,子目录是嵌套列表,等等。。。在

the two directories:
oldfiles/
    a_tar_ball.tar
    a_text_file.txt
    nest1/
        file_in_nest
        nest1a/
            file_in_nest

newfiles/
    a_tar_ball.tar
    a_text_file.txt
    nest1/
        file_in_nest
        nest1a/

问题:通常所有文件都应该正常,因为oldfiles中的所有文件都应该存在于newfiles中,但是在上面的示例中,“newfiles/”中缺少一个“file-in-unest”。 我希望打印一条错误消息,告诉我哪个文件丢失了,但是当我使用“compare”函数当前实例下面的代码结构时,除了最近的目录外,不知道其他任何目录。我想知道是否有一个内置的错误处理,可以发送有关文件和目录的信息在递归阶梯中向上添加信息。如果我只打印丢失文件的文件名,我就不知道是哪一个文件,因为“oldfiles”中有两个“file”

^{pr2}$

这是我在stackoverflow上的第一个活动,除了阅读som,请告诉我是否需要改进这个问题!在

//斯特凡


Tags: 文件textin目录txt列表difftar
1条回答
网友
1楼 · 发布于 2024-10-01 17:36:59

好吧,这取决于您是要将错误报告为异常还是某种形式的状态。在

假设您想使用“异常”方式并使整个程序崩溃如果缺少一个文件,您可以定义自己的异常,将状态从被调用方保存到调用方:

class PathException(Exception):
    def __init__(self, path):
        self.path = path
        Exception.__init__(self)

def compare(filetree):
    old, new = filetree
    for counter, entry in enumerate(old[1:]):
        if entry not in new:
            raise PathException(entry)
        elif not isinstance(entry, basestring):
            os.chdir(entry[0])
            try:
                compare(entry)
                os.chdir("..")
            except PathException as e:
                os.chdir("..")
                raise PathException(os.path.join(entry, e.path))
        else:
            ...

其中try是一个递归调用,并用调用方的信息更新任何传入的异常。在

为了在一个较小的示例中看到它,让我们尝试深入比较两个列表,并在它们不相等时引发一个异常:

^{pr2}$

这给了我们:

>>> L1 = [[[1,2,3],[4,5],[[6,7,8],[7,9]]],[3,5,[7,8]]]
>>> assertEq(L1, L1)

什么都不会发生(列表类似),并且:

>>> L1 = [[[1,2,3],[4,5],[[6,7,8],[7,9]]],[3,5,[7,8]]]
>>> L2 = [[[1,2,3],[4,5],[[6,7,8],[7,5]]],[3,5,[7,8]]] # Note the [7,9] -> [7,5]
>>> try:
...     assertEq(L1, L2)
... except MyException as e: 
...     print "Diff at",e.path
Diff at [0, 2, 1, 1]
>>> print L1[0][2][1][1], L2[0][2][1][1]
9 5

这就提供了完整的路径。在

由于递归列表或路径基本上是相同的,因此很容易使其适应您的用例。在

另一种解决此问题的简单方法是将文件中的差异报告为一个简单的差异,与其他文件类似:您可以将其作为旧文件和(不存在)新文件之间的差异返回,或者同时返回文件中的差异列表和文件的差异列表,在这种情况下,很容易递归地更新由递归调用返回的值。在

相关问题 更多 >

    热门问题