2016-10-18 17 views
5

私はジュピターのノートブックで長時間の実験を行っています。彼らがいつ終了するかわからないので、ノートブックの最後のセルに電子メール機能を追加するので、ノートブックが完了すると自動的に電子メールが届きます。ノートの例外を処理するJupyterの魔法

しかし、いずれかのセルにランダム例外があると、ノートブック全体が実行を停止し、メールを受け取ることはありません。 例外/カーネル停止の場合に関数を実行できるいくつかの魔法の機能があるのだろうかと思います。

def handle_exception(stacktrace): 
    send_mail_to_myself(stacktrace) 


%%in_case_of_notebook_exception handle_exception # <--- this is what I'm looking for 

のような他の選択肢は、右、のtry-catch内のすべてのセルをカプセル化するだろうか?しかし、それはとても面倒です。

ご意見ありがとうございます。

答えて

8

このような魔法のコマンドは存在しませんが、あなたはそれを書くことができます。

from IPython.core.magic import register_cell_magic 

@register_cell_magic 
def handle(line, cell): 
    try: 
     exec(cell) 
    except Exception as e: 
     send_mail_to_myself(e) 
     raise # if you want the full tracebook in the notebook 

ノートブック全体のmagicコマンドを自動的に読み込むことはできません。この機能が必要な各セルにmagicコマンドを追加する必要があります。

%%handle 

some_code() 
raise ValueError('this exception will be caught by the magic command') 
+0

OPが提起された電子メール*を受信したい場合、 'try ... finally ...'ブロックがより適しているかもしれません。 'try ... except ...'では、例外を処理することが期待されています。今はそうではありません。もう一つの方法は、それを再評価することです。 IMO、「最終的に」はより強固です。 – x0s

+1

@ x0sを 'try ... finally ...'ブロックで実行すると、実行されたすべてのセルに対してメールが送信されます。 OPが望むものではありません。しかし、それを再評価することは良い考えです。私は編集しました。 – show0k

2

あなたのセルにtry..exceptステートメントを使用しないで、すぐに使用できる方法はないと思います。 AFAIK a 4 years old issueにはこれが記載されていますが、まだ開かれた状態です。

ただし、runtools extensionがこのトリックを行う可能性があります。

4

@ show0kは、私の質問に(マジックメソッドに関して)正しい答えを与えました。どうもありがとう! :)

この回答は、少し深く掘り下げてくれました。私はのカスタム例外ハンドラを定義できるIPythonメソッドを見つけました。

from IPython.core.ultratb import AutoFormattedTB # initialize the formatter for making the tracebacks into strings itb = AutoFormattedTB(mode = 'Plain', tb_offset = 1) # this function will be called on exceptions in any cell def custom_exc(shell, etype, evalue, tb, tb_offset=None): # still show the error within the notebook, don't just swallow it shell.showtraceback((etype, evalue, tb), tb_offset=tb_offset) # grab the traceback and make it into a list of strings stb = itb.structured_traceback(etype, evalue, tb) sstb = itb.stb2text(stb) print (sstb) # <--- this is the variable with the traceback string print ("sending mail") send_mail_to_myself(sstb) # this registers a custom exception handler for the whole current notebook get_ipython().set_custom_exc((Exception,), custom_exc) 

だから、これはどのノートブックの上部にある単一のセルに入れることができ、結果としてそれが何かがうまくいかない場合の郵送を行います。

は、私はそれがこのように動作するようになりました。

自己紹介/ TODO:ノートに取り込み、ラインマジックで起動できる小さなPythonモジュールにこのスニペットを作成します。

ご注意ください。ドキュメントには、このset_custom_excメソッドの警告が含まれています: "警告:独自の例外ハンドラをIPythonのメイン実行ループに入れることで、クラッシュする可能性が非常に高くなります。 "