簡體   English   中英

在 if 語句中引發異常為 e

[英]Raise exception as e in if statement

我想出了一些代碼來將文件的異常作為電子郵件發送,並更新 .txt 日志文件。 此方法適用於以下示例:

from send_mail import send_error_email
from datetime import datetime
import logging

logging.basicConfig(filename='log.txt', level=logging.DEBUG, format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger=logging.getLogger(__name__)

now = datetime.now()
date = now.strftime("%m/%d/%Y")
time = now.strftime("%H:%M:%S")

try:
    a = 2 + 'seven'
except Exception as e:
    print(e)
    send_error_email(exception=e, message="Can't add string and int")
    logging.exception('Oh no! Error on {} at {} Here is the traceback info:'.format(date, time))

但是,我想應用它的函數有很多if/else語法,在ifelse塊中引發異常。 這里有兩個例子:

def is_empty(test_df):
    if(test_df.empty):
        raise Exception("The sheet: {} is empty".format(sheet_name))
    else:
        pass
    for col in test_df.columns:
        miss = test_df[col].isnull().sum()
        if miss>0:
            raise Exception("{} has {} missing value(s)".format(col,miss))
    return None

或者

def column_validation(sheet_name, input_file, expected_columns, input_columns, months):
    if len(expected_columns) == len(input_columns):
        for i in range(len(input_columns)):
            if input_columns[i] != expected_columns[i]:
                if sheet_name == "G2 30yr":
                    if input_columns[i][:3] in months:
                        continue
                elif sheet_name != "G2 30yr":
                    if input_columns[i] in months:
                        continue
                else:
                    raise Exception("The {} sheet of file: {}'s columns are not in expected format.".format(sheet_name, input_file))
    else:
        raise Exception("Number of columns in file: {}, {} sheet are not as expected".format(input_file, sheet_name))
    return None

我不確定如何使用電子郵件和日志功能以及在try/except塊之外引發的異常,在這些塊中我可以使用except Exception as e:訪問 Exception 屬性。 下面的else將發送電子郵件通知,但不會正確更新日志文件。

else:
    send_error_email(exception=e, message="Can't add string and int")
    logging.error('Oh no! Error on {} at {} Here is the traceback info:'.format(date, time), stack_info = True)
def catch_exception_and_send_email(func):
    def exception_catcher(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception e:
            print(e)
            now = datetime.now()
            date = now.strftime("%m/%d/%Y")
            time = now.strftime("%H:%M:%S")
            send_error_email(exception=e, message="Can't add string and int")
            logging.exception('Oh no! Error on {} at {} Here is the traceback info:'.format(date, time))
    return exception_catcher

現在,使用它來裝飾您預期可能引發異常的函數:

@catch_exception_and_send_email
def is_empty(test_df):
    # function body


@catch_exception_and_send_email
def column_validation(sheet_name, input_file, expected_columns, input_columns, months):
    # function body

現在,無論何時調用您的任何裝飾函數,裝飾器的代碼都會運行,首先try您的函數代碼,如果您的函數raise異常,裝飾器會捕獲它,記錄它並發送電子郵件。

我還建議實施自定義異常,但這不是重點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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