繁体   English   中英

尝试,除了不能在Python中工作

[英]Try, except not working in Python

我试图通过添加try和except块来向该程序添加错误处理,以防万一某些内容无法正常工作,并且在处理数据时出现错误的情况下不会关闭程序。 (这是我的代码的精简版)。 当我以这种方式运行它时(假设时间是准确的),似乎没有任何效果report_scheduler的函数实际上从未运行过。

这是我正在查看的代码:

import schedule

def forex_data_report():
    from forex_python.converter import CurrencyRates
    import csv

    current_dir = os.getcwd()

    date_time = time.strftime('%m-%d-%Y_at_%I-%M-%S-%p')

    c = CurrencyRates()
    usd_eur = c.get_rate('EUR', 'USD')
    usd_gbp = c.get_rate('GBP', 'USD')
    usd_yen = c.get_rate('JPY', 'USD')
    usd_aud = c.get_rate('AUD', 'USD')
    eur_gbp = c.get_rate('GBP', 'EUR')

    clean_file_location = current_dir + '\\Reports\\Forex_Data\\Forex_Data.csv'
    with open(clean_file_location, 'a', newline='') as outfile:
        writer = csv.writer(outfile)
        writer.writerow([date_time, usd_eur, usd_gbp, usd_yen, usd_aud, eur_gbp])

    send_outlook_w_attach('Key Currencies', clean_file_location)

    print ('Updated Key Currencies Data.')

def competitor_stock_data_report():
    import datetime
    import pandas_datareader.data as web
    import csv

    current_dir = os.getcwd()

    date_print = time.strftime('%m-%d-%Y_at_%I-%M-%S-%p')
    date_time = datetime.datetime.now()
    date = date_time.date()

    stocklist = ['LAZ','AMG','BEN','LM','EVR','GHL','HLI','MC','PJT','MS','GS','JPM','AB']
    start = datetime.datetime(date.year-1, date.month, date.day-1)
    end = datetime.datetime(date.year, date.month, date.day-1)

    clean_file_location = current_dir + '\\Reports\\XXX\\Stock_Data.csv'

    for x in stocklist:
        df = web.DataReader(x, 'google', start, end)

        with open(clean_file_location, 'a', newline='') as outfile:
            writer = csv.writer(outfile)
            writer.writerow([date_print, x, df.loc[df.index[0], 'Close'], df.loc[df.index[-1], 'Close']])

    send_outlook_w_attach('Competitor Stock Data vs. XXX', clean_file_location)

    print ('Updated XXX Competitor Stock Performance Data.')

def report_scheduler():
    try:
        schedule.every().day.at("00:00").do(forex_data_report)
    except:
        pass

    try:
        schedule.every().friday.at("00:01").do(competitor_stock_data_report)
    except:
        pass

    while True:
        schedule.run_pending()
        time.sleep(1)


if __name__ == '__main__':

    print('Starting background - HANDLER - process...')

    report_scheduler()

我知道该pass不是错误处理,但是我确实需要某种方式来告诉程序继续,即使数据没有更新/发生错误也是如此。

谢谢。

在没有真正深入代码的情况下,可能会引发异常,然后将其捕获,然后pass语句意味着您不会获得任何输出。

您是否检查了它的运行情况,但没有尝试使用try块?

此外,这可能会有所帮助:

except Exception as e:
  print("Exception raised: {}".format(e))

至少您会获得例外打印输出。 您可能还想研究记录异常。

我对您使用的库不熟悉-如果您发布一个我们可以自行完善的完整程序并命名所有涉及的第三方库,这将非常有帮助-但我怀疑您想要尝试-除了内部forex_data_reportcompetitor_stock_data_report 您不关心调度定期任务行为引发的异常,是吗? 您想吞并定期任务本身中的异常。 试用结构如下的代码:

def forex_data_report():
    # unchanged

def forex_data_report_wrapper():
    try:
        forex_data_report()
    except Exception as e:
        logger.exception(e)

# similarly for competitor_stock_data_report

def report_scheduler():
    schedule.every().day.at("00:00").do(forex_data_report_wrapper)
    schedule.every().friday.at("00:01").do(competitor_stock_data_report_wrapper)

    while True:
        schedule.run_pending()
        time.sleep(1)

另请注意,我正在使用except Exception而不是except 几乎没有except东西可以捕获您几乎肯定不想捕获的东西,例如KeyboardInterruptStopIteration

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM