2017-10-20 11 views
2

私はこのプログラムにエラー処理を追加しようとしています。何かがうまくいかない場合にtryとexceptブロックを追加して、データを処理する際にエラーが発生した場合にプログラムがシャットダウンしないようにします。 (これは私のコードのダウンしたバージョンです)。このように実行すると(時間が正確であることを考えると)、何も動作していないように見えます。report_schedulerの機能は実際には実行されません。私はpassがエラー処理されていない理解して、私は、データがない場合でも、継続してプログラムを伝えるための方法のいくつかの並べ替えが必要なのです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() 

:ここ

は私が探していたコードです更新中/エラーが発生する。

ありがとうございました。

+0

これらの関数のいずれかを呼び出すコードの部分はどこですか? –

+0

'report_scheduler' – sgerbhctim

+2

report_schedulerは何と呼びますか? –

答えて

2

実際にコードに深く入り込むことなく、おそらく例外が発生してキャッチされ、その後passステートメントが出力されないことを意味します。

試してみませんか?

また、これは役立つかもしれない:

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

少なくとも、あなたはあなたの例外のプリントアウトを取得します。例外のロギングを調べることもできます。

+0

もちろん、プログラムはtryブロックなしで実行されます。私はこれをバックグラウンドプロセスとして構築するため、24時間365日実行します。エラーが発生します(例えば、昨夜のように)私はプログラムを終了させたくありません。 – sgerbhctim

+0

さて、zwolのように、スケジューラ自体の周りではなく、スケジュールされたコードにブロック以外のtryブロックを置く必要があるようです。また、夜間に実行されている場合は、ロギングモジュールを参照して、例外を記録してください。がんばろう! – chasmani

2

私はあなたが使用しているライブラリに精通していません - 完全なプログラムを投稿すると非常に役に立ちます。私たち自身とやりとりすることができます。 try-exceptブロックをの中に入れたいと思うのですが、forex_data_reportcompetitor_stock_data_reportです。あなたは、定期的なタスクをスケジュールする行為によってスローされた例外に心配していません、あなたですか? 定期的なタスクそのものの例外を飲みたい場合私はexcept Exception代わりのexceptを使用していていることも

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は、ほとんど確実にキャッチしたくないもの、例えばKeyboardInterruptStopIterationをキャッチします。

+0

ありがとう - 私はそれを試してみましょう。 – sgerbhctim

関連する問題