2017-10-20 58 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