2017-10-20 90 views
2

我试图通过添加try和except块以防止某些情况下无法正常工作并且在处理数据时出现错误时不会关闭程序的错误处理。 (这是我的代码的一个虚拟版本)。当我以这种方式运行它时(考虑到时间准确),似乎没有任何工作 - report_scheduler中的函数实际上并没有运行。尝试,除非不在Python中工作

这里是我看代码:

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没有错误处理,但我确实需要某种方式告诉程序继续运行,即使数据不正在更新/发生错误。

谢谢。

+0

你的代码中哪些部分调用了这些函数? –

+0

'report_scheduler' – sgerbhctim

+2

什么叫report_scheduler? –

回答

2

没有真正深入您的代码,可能会引发异常,然后捕获,然后通过语句意味着你没有得到任何输出。

你有没有检查它运行没有尝试除了块?

而且,这可能帮助:

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

至少这样你会得到你的异常的打印输出。你可能也想看看记录异常。

+0

是的,当然程序运行时没有尝试,除了块以外。我将它作为后台进程构建,所以它可以全天候运行,但是当发生错误(例如昨晚)我不希望程序关闭。我希望它通知我发生了一个错误,并继续.. – sgerbhctim

+0

好吧,在这种情况下,可能像zwol说,你需要把除了块之外的尝试放在计划的代码中,而不是围绕调度程序本身。此外,如果它正在运行,请在进入日志记录模块时记录异常。祝你好运! – chasmani

2

我对您使用的库不熟悉 - 如果您发布完整程序,我们可以自行修改并命名所有涉及的第三方库,这会非常有帮助 - 但我怀疑你想要在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

+0

谢谢你 - 我会试试看。 – sgerbhctim