[英]Logging and exceptions in Python
我目前正在編寫我的第一個更大的腳本,它是一個基於控制台的 GUI,用戶通過輸入數字來選擇選項來啟動幾個任務:
我最近實施了很多錯誤處理,以防止窗口在后台出現問題時關閉。 我有點困惑我的方法是否正確。
我的代碼的基本結構如下:
有一個函數read_excel()
可以用read_excel()
加載一些 Excel 文件:
def read_excel(excel_path):
try:
df = pd.read_excel(excel_path, encoding="utf-8")
except FileNotFoundError:
raise FileNotFoundError('Unable to load assignment file, maybe choose custom')
return
# do stuff....
if not all(len(x) == len(signalnames) for x in [frequencies, cans]):
raise ValueError('Frequency and can number must be given for every signal in assignment file!')
else:
logging.info("Successfully loaded assignment file")
return signalnames, frequencies, group_names, cans, can_paths
然后,該函數與 GUI 調用的函數ft_14()
中的其他函數一起使用:
def ft_14(files, draft assignement_path):
try:
signalnames, frequencies, group_names, cans, can_paths = read_excel(assignement_path)
except (ValueError, FileNotFoundError) as e:
logging.error(e)
return
# do stuff..
try:
wb.save(os.path.join(os.path.dirname(files[0]), "FT.14_results.xlsx"))
wb.close()
except Exception:
logging.error('Unable to save report excel')
所以我的嘗試是在后端引發異常,然后在 GUI 調用的函數中排除它們,並使用日志記錄為用戶顯示它們。 所以我的問題是這種方法是否是使用異常和一起記錄的正確方法,或者是否有更聰明的方法,因為調用:
try:
# some function()
except Exection as e:
logging.error(e)
對我來說不合適。
你在最后發布的代碼讓你感到不舒服,它是正確的,因為它做了它所說的。 如果有異常,它會記錄錯誤。
令人擔憂的是它也處理異常。 在許多情況下,您不想更改異常處理過程中的任何其他內容——您只想記錄日志,並讓異常正常傳播。
https://docs.python.org/3/tutorial/errors.html#rising-exceptions
import logging
logger = logging.getLogger(__name__)
def fn(x):
try:
return x / 0
except Exception as e:
logger.error(str(e))
raise e
print ("let's do something risky")
try:
fn(20)
except Exception as e:
pass
print ("it has been done")
請注意 fn(x) 如何檢測和處理異常,然后重新引發它們,就好像它根本沒有對異常做任何事情一樣? 你用“加注”而不是爭論來做到這一點。
在您的第一個代碼示例中,您捕獲一個異常,然后引發一個完全不同的異常,該異常恰好屬於同一類型:
except FileNotFoundError:
raise FileNotFoundError('Unable to load assignment file, maybe choose custom')
如果您想隱藏信息,這可能是公平的游戲,例如,如果異常具有您不想向外部公開的內部詳細信息。 但是您不知道通過用新實例完全替換異常會丟失哪些信息。 但這些都不是“對”或“錯”,它們只是您對如何處理異常做出的選擇。 (編輯:最終處理它們或記錄它可能拋出的內容是一種很好的做法,但我們離題了)
這些對記錄器來說都不重要。 你可以在那里記錄它並重新加注。 您可以記錄原始異常,然后提升經過消毒的版本。 你可以在那里處理它,記錄它,而不是提高(如你發布的例子)。 記錄器不關心你用異常做什么。 如果您想記錄它,請立即記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.