改變你的程序流程一點點清晰,儘量節省當你的程序未能在顯著的方式進行異常處理程序,需要提醒用戶或完全改變程序流(異常情況)。當系統遇到問題時存在例外情況它不能修復。
如果你不得不跳下一架飛機,你想要發現的最後一件事就是沒有可用的降落傘。因此,使用os.path.exists()
來告訴您在處理異常時路徑是否有效。最安全的默認值是當前目錄,可以使用.
作爲路徑進行訪問。但是,如果沒有,你應該能夠假設用戶目錄已經存在,以防萬一你的代碼需要崩潰並燒燬。你必須處理異常之前,而不是之前。
也一定要在Python中正確縮進。間距也可以幫助捕獲錯誤,所以當代碼更容易閱讀時,不要害怕使用換行符。你try
條款需要一個額外的縮進級別:
try:
# simplify the if statement to stop repeating yourself
if not os.path.exists(project_dir):
os.makedirs(project_dir)
file_location = project_dir
except OSError as exc:
if exc.errno != errno.EEXIST:
raise # reraise the current exception
if os.path.exists(user_dir):
file_location = user_dir
else: # FUBAR. Sound sirens immediately and try everything to keep the file somewhere in memory before failing.
print("[ERROR] {} was inaccessible.\nWhile attempting to recover, {} did not exist so files could not be backed up."
.format(project_dir, user_dir))
raise
異常處理程序的失敗不應該允許這種情況發生。這是一場災難性的事件,您應該期望唯一的選擇仍然是崩潰到桌面。一個例外可以被捕獲並從中恢復。兩三個嵌套的異常意味着你的計算機可能已經達到了感知能力並開始推翻它的數字枷鎖(或者你需要認真思考你爲什麼要處理異常)。
請張貼您的代碼以反映您使用的實際縮進。 – patrick
歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在發佈您的MCVE代碼並準確描述問題之前,我們無法爲您提供有效的幫助。 我們應該能夠將發佈的代碼粘貼到文本文件中,並重現您描述的問題。 – Prune
謝謝,帕特里克我試圖讓這篇文章被吸引,但將它取消! –