2016-11-18 40 views
0

我一直在試圖找到一個答案,關於如何使用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 

回答

1

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

相關問題