我正在为标准库的 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
两个代码示例之间的行为是否存在不同?
最佳答案
否
在单线程应用程序中,两者不存在不同。不过,在多线程应用程序中,“路径”可能会在两个 try except 之间发生变化。
此代码是在修复符号链接(symbolic link)攻击漏洞的补丁中引入的 ( http://bugs.python.org/issue4489 )。也许您应该在更改后要求原始提交者进行代码审查。根据http://hg.python.org/cpython/annotate/c910af2e3c98/Lib/shutil.py#434 ,我是海尼克·施拉瓦克。
关于python - 将两个 Python try/except block 压缩为一个而不改变行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15485468/