将两个Python try / except块压缩为一个而不改变行为

时间:2013-03-18 19:41:35

标签: python exception exception-handling python-3.x

我正在为标准库shutil.rmtree()中的错误处理中的现有错误修补补丁,我遇到了这样的代码:

try:
    orig_st = os.lstat(path)
except Exception:
    onerror(os.lstat, path, sys.exc_info())
    return
try:
    fd = os.open(path, os.O_RDONLY)
except Exception:
    onerror(os.lstat, path, sys.exc_info())
    return

我希望在应用我的更改以简化实现之前将其简化为以下内容:

try:
    orig_st = os.lstat(path)
    fd = os.open(path, os.O_RDONLY)
except Exception:
    onerror(os.lstat, path, sys.exc_info())
    return

是否存在两个代码示例之间行为不同的情况?

3 个答案:

答案 0 :(得分:4)

在单线程应用程序中没有两种情况不同的情况。但是,在多线程应用程序中,“路径”可能会在两个尝试例外之间发生变化。

此代码是在修复符号链接攻击漏洞(http://bugs.python.org/issue4489)的补丁中引入的。也许您应该在更改后询问原始提交者以进行代码审查。根据{{​​3}},它是Hynek Schlawack。

答案 1 :(得分:1)

我认为这两种情况是相同的,但只是因为每个异常块中都有return,这意味着如果异常,第二个try...except块实际上并没有被执行在第一次遇到。

如果第一个try...except没有return,那么即使在第一个块中遇到异常,也会执行第二个try...except块,这两个案例会不一样。

答案 2 :(得分:0)

我认为他们分裂的原因是因为如果它在第一次尝试时捕获Exception,那么它仍然会设置一个值为fd。你写它的方式,如果异常被捕获在第一位代码(即orig_st)上,那么它将永远不会设置fd,因为它已经传递了它,即使它可能不包含异常。