[英]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
語法,在if
或else
塊中引發異常。 這里有兩個例子:
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.