簡體   English   中英

Python 中的日志記錄和異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM