我正在为标准库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
是否存在两个代码示例之间行为不同的情况?
答案 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,因为它已经传递了它,即使它可能不包含异常。