在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 
+0

我一定是错过了拼凑,感谢指出了这一点。另外,感谢我的代码的更简化版本。因为我必须处理'onerror'函数中的任何错误,所以我会如何将'onerror'函数气泡中发生的任何错误备份到try/except语句并触发'pass'? – CaffeinatedCoder

+1

@CaffeinatedCoder任何自然发生的异常将通过堆栈框架起泡,直到它找到一个处理程序... – donkopotamus

+0

难以解决,第一部分的答案首先让我困惑。因此,如果我使用您提供的简化代码和'remove_readonly'函数,那么现在所有发生在该函数中的错误都将由'except'语句处理?我只是想澄清一下,因为当你说“自然发生”的错误。什么构成了自然错误和不自然的错误? – CaffeinatedCoder