2017-04-19 1 views
0

すべての例外をキャッチして、次のコードでログファイルに記録しようとしていますが、なんらかの理由でそれらをキャッチしません。コードは次のとおりです。Jupyter Pythonの例外キャッチャーが機能しない(sys.excepthook)

その後
# Prepares logging 
import logging 
import time 
output_folder='whatever' 
# Logging to file: 
today=time.strftime("%Y%M%d %H:%M:%S") 
logging.basicConfig(filename=output_folder+'/logger '+today+'.log',level=logging.DEBUG, 
        format='%(asctime)s %(message)s', filemode='w') 
logging.info('Program started.') 

# Every time there is an error, catch it 
import sys 
#def error_catching(exctype, value, tb): 
def log_uncaught_exceptions(ex_cls, ex, tb): 
    print "Error found" 
    logging.critical(''.join(traceback.format_tb(tb))) 
    logging.critical('{0}: {1}'.format(ex_cls, ex)) 

sys.excepthook = log_uncaught_exceptions 

私は存在しない変数(「M」)を呼び出すことによって、例えば、エラーを生成し、私はエラーを取得するが、何もログファイル内のログではありません:

m #this should generate a NameError, which is the following 

--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-9-69b64623f86d> in <module>() 
----> 1 m 

NameError: name 'm' is not defined 

また、ログファイルには何も記録されません。私は何を間違えたのですか?

ありがとうございます!

+0

iPythonがこのフックに依存しているかどうかはわかりません。私はそれが独力でフックを持っていると思う。私は24時間以内に何も提供されなければ、より良い答えを書こうとします。 – Josay

+0

http://stackoverflow.com/questions/1261668/cannot-override-sys-excepthookを参照してください(恐らく重複した質問...) – Josay

+0

Josay、ご意見ありがとうございます。重複とマークされた回答にはいくつかの共通点がありますが、その質問で選択された回答は正解ではない可能性があります。あなたの方法を試して、あなたに戻ってきます。 – Escachator

答えて

1

免責事項:明らかに、公開賞金のある質問はクローズできません。したがって、私の答えは、ほとんどthis other similar question/answerに基づいています。

変更するsys.excepthookは、iPythonでは機能しません。

回避策はIPython.core.interactiveshell.InteractiveShell.showtracebackを更新することです。

danrobinson/tracestackなどのプロジェクトでは、追加の説明とその修正の実装があります。

+0

これは素晴らしいですね。ありがとう@ジョセイ – Escachator

関連する問題