在try/except语句中是否可以使用带有onerror函数的rmtree命令?
问题描述:
我一直在试图找到一个答案,关于如何使用shutil.rmtree
命令内部 try/except语句处理错误处理和传播。我试图找到一个显示这种做法的例子,但一直没有找到。所以,我仍然想知道这是否可能。当读取文档的命令here我看到它指出:在try/except语句中是否可以使用带有onerror函数的rmtree命令?
...删除Windows上的目录树里的一些文件有 他们只读位设置。它使用onerror回调清除 只读位并重新尝试删除。任何后续的失败将传播。
不这是否意味着如果最初的尝试后出现错误内的onerror
函数来执行onerror
功能,换句话说,onerror
功能不修复错误和它发生的shutil.rmtree
时尝试再次运行,错误将在主例程中(try/except语句所在的位置)引发?这是否意味着“任何后续的失败都会传播”?
我试图确定,如果无论出于何种原因,shutil.rmtree
命令都会失败,导致失败将被捕获并且代码仍将继续。我在脚本之后运行了另一个脚本来检查/更正批处理错误,这就是为什么我没有直接处理错误。我只需要确保这个脚本一直运行。下面的代码是否会在写入时完成此操作,或者是否有任何需要更改的操作来完成此操作?
import shutil
import os
import stat
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
func(path)
try:
#os.chmod is used to turn off Read-Only attribute
os.chmod("Q:/-----.vbs", stat.S_IWRITE)
#os.remove is used to remove individual files
os.remove("Q:/-----.vbs")
except:
pass
#shutil.rmtree is used to remove entire directories
#remove traces of file
try:
shutil.rmtree("Q:/FolderToRemove1", onerror=remove_readonly)
except:
pass
try:
shutil.rmtree("Q:/FolderToRemove2", onerror=remove_readonly)
except:
pass
try:
shutil.rmtree("Q:/FolderToRemove3", onerror=remove_readonly)
except:
pass
try:
shutil.rmtree("Q:/FolderToRemove4", onerror=remove_readonly)
except:
pass
try:
shutil.rmtree("Q:/FolderToRemove5", onerror=remove_readonly)
except:
pass
try:
shutil.rmtree("C:/Users/mhill/Desktop/screenshots", onerror=remove_readonly)
except:
pass
答
的documentation状态,通过募集的onerror例外不会被抓到。因此你必须自己处理。
就您的示例代码而言,空白except
通常设计不佳。特别是,它也会捕获一个KeyboardInterrupt
,这肯定不是你的意图。
相反,这样的事情:
for f in ["Q:/FolderToRemove1", "Q:/FolderToRemove2",
"Q:/FolderToRemove3", "Q:/FolderToRemove4",
"Q:/FolderToRemove5", "C:/Users/mhill/Desktop/screenshots"]:
try:
shutil.rmtree(f, onerror=remove_readonly)
except Exception:
pass
我一定是错过了拼凑,感谢指出了这一点。另外,感谢我的代码的更简化版本。因为我必须处理'onerror'函数中的任何错误,所以我会如何将'onerror'函数气泡中发生的任何错误备份到try/except语句并触发'pass'? – CaffeinatedCoder
@CaffeinatedCoder任何自然发生的异常将通过堆栈框架起泡,直到它找到一个处理程序... – donkopotamus
难以解决,第一部分的答案首先让我困惑。因此,如果我使用您提供的简化代码和'remove_readonly'函数,那么现在所有发生在该函数中的错误都将由'except'语句处理?我只是想澄清一下,因为当你说“自然发生”的错误。什么构成了自然错误和不自然的错误? – CaffeinatedCoder