我一直在試圖找到一個答案,關於如何使用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
我一定是錯過了拼湊,感謝指出了這一點。另外,感謝我的代碼的更簡化版本。因爲我必須處理'onerror'函數中的任何錯誤,所以我會如何將'onerror'函數氣泡中發生的任何錯誤備份到try/except語句並觸發'pass'? – CaffeinatedCoder
@CaffeinatedCoder任何自然發生的異常將通過堆棧框架起泡,直到它找到一個處理程序... – donkopotamus
難以解決,第一部分的答案首先讓我困惑。因此,如果我使用您提供的簡化代碼和'remove_readonly'函數,那麼現在所有發生在該函數中的錯誤都將由'except'語句處理?我只是想澄清一下,因爲當你說「自然發生」的錯誤。什麼構成了自然錯誤和不自然的錯誤? – CaffeinatedCoder