這可能是一個開放式或尷尬的問題,但我發現自己陷入越來越多的異常處理問題,我不知道處理它們的「最佳」方法。正確處理logging.config.fileConfig拋出的IOError?
如果您嘗試使用不存在的文件配置FileHandler,則Python的日誌記錄模塊會引發IOError。該模塊不處理這個異常,但只是提出它。通常情況下,文件路徑不存在(因此文件不存在),所以如果我們想要處理異常並繼續,我們必須沿路徑創建目錄。
我想讓我的應用程序正確處理這個錯誤,因爲每個用戶都問過爲什麼我們不爲他們製作正確的目錄。
我決定處理這個問題的方式可以在下面看到。
done = False
while not done:
try:
# Configure logging based on a config file
# if a filehandler's full path to file does not exist, it raises an IOError
logging.config.fileConfig(filename)
except IOError as e:
if e.args[0] == 2 and e.filename:
# If we catch the IOError, we can see if it is a "does not exist" error
# and try to recover by making the directories
print "Most likely the full path to the file does not exist, so we can try and make it"
fp = e.filename[:e.rfind("/")]
# See http://stackoverflow.com/questions/273192/python-best-way-to-create-directory-if-it-doesnt-exist-for-file-write#273208 for why I don't just leap
if not os.path.exists(fp):
os.makedirs(fp)
else:
print "Most likely some other error...let's just reraise for now"
raise
else:
done = True
我需要循環(或遞歸我想)由於存在需要配置,因此需要ÑIOErrors被升高和用於此方案中校正ÑFileHandlers。
這是正確的方法嗎?有沒有更好,更Python的方式,我不知道或不明白?
我很困惑,不存在的文件是否是配置文件(傳遞給'fileConfig',就像你的源文件一樣)或者它是否是日誌文件的名稱(根據你的問題的文本)嘗試使用不存在的文件配置FileHandler「)。我的答案是後者。通常,在指定文件時(無論是配置文件還是日誌文件),需要確保很多事情 - 例如,文件可能已經存在,但由於權限問題而不可讀或不可寫。沒有一個適合所有人的解決方案,這就是爲什麼你有時需要推出自己的產品。 –
我指的是日誌文件的名稱,我需要從日誌記錄配置文件中取出來檢查它是否存在。必須在代碼中的此處獲取該信息是不方便的。我同意你的觀點,即在啓動時進行檢查是理想的。也許我真正的問題是爲什麼記錄模塊不處理用戶的這些類型的異常? – dicato
由於日誌記錄模塊需要將日誌文件名稱指定爲可寫入文件,並且存在於該目錄中。這種行爲符合最小驚喜的原則。一個典型的文本編輯器(例如,Windows上的記事本或Linux上的gedit),當在不存在的目錄中使用文件名進行調用時,不會自動爲您創建文件。記事本給出錯誤信息; gedit不會以該名稱保存該文件,但會在您單擊「保存」時提示您輸入位置。 –