2

我正在为标准库中的错误处理中的现有错误开发补丁,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

在任何情况下,两个代码示例之间的行为会有所不同吗?

4

3 回答 3

4

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

此代码是在修复符号链接攻击漏洞 ( http://bugs.python.org/issue4489 ) 的补丁中引入的。也许您应该在更改后要求原始提交者进行代码审查。根据http://hg.python.org/cpython/annotate/c910af2e3c98/Lib/shutil.py#434,它是 Hynek Schlawack 。

于 2013-03-18T20:21:45.240 回答
1

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

如果第一个try...except没有return,那么try...except即使在第一个块中遇到异常,也会执行第二个块,并且这两种情况不会相同。

于 2013-03-18T20:07:03.827 回答
0

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

于 2013-03-18T19:59:38.107 回答