我想出了一些代碼來將檔案的例外作為電子郵件發送,并更新 .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語法,在iforelse塊中引發例外。這里有兩個例子:
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:. 下面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)
uj5u.com熱心網友回復:
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
現在,使用它來裝飾您預期可能引發例外的函式:
@exception_catcher
def is_empty(test_df):
# function body
@exception_catcher
def column_validation(sheet_name, input_file, expected_columns, input_columns, months):
# function body
現在,無論何時呼叫您的任何裝飾函式,裝飾器的代碼都會運行,首先try是您的函式代碼,如果您的函式raise是例外,裝飾器會捕獲它,記錄它并發送電子郵件。
我還建議實施自定義例外,但這不是重點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494826.html
