2016-10-18 14 views
5

मेरे पास मेरे जुपीटर नोटबुक में कुछ लंबे समय से चलने वाले प्रयोग हैं। क्योंकि मुझे नहीं पता कि वे कब खत्म करेंगे, मैं नोटबुक के अंतिम सेल में एक ईमेल फ़ंक्शन जोड़ता हूं, इसलिए नोटबुक पूरा होने पर मुझे स्वचालित रूप से एक ईमेल प्राप्त होता है।नोटबुक अपवादों को संभालने के लिए जुपीटर जादू

लेकिन जब किसी एक कक्ष में यादृच्छिक अपवाद होता है, तो संपूर्ण नोटबुक निष्पादित करना बंद कर देता है और मुझे कभी भी कोई ईमेल नहीं मिलता है। तो मैं सोच रहा हूं कि कुछ जादू कार्य है जो अपवाद/कर्नेल स्टॉप के मामले में फ़ंक्शन निष्पादित कर सकता है।

तरह

def handle_exception(stacktrace): 
    send_mail_to_myself(stacktrace) 


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

अन्य विकल्प कोशिश पकड़ में हर कोशिका को संपुटित करने के लिए, सही हो सकता है? लेकिन यह बहुत थकाऊ है।

किसी भी सुझाव के लिए अग्रिम धन्यवाद।

उत्तर

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 

पूरे नोटबुक के लिए स्वचालित रूप से जादू कमांड लोड करना संभव नहीं है, आपको इसे प्रत्येक सेल में जोड़ना होगा जहां आपको इस सुविधा की आवश्यकता है।

%%handle 

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

एक 'कोशिश करें ... आखिरकार ... यदि ओपी ईमेल प्राप्त करना चाहता है तो ब्लॉक अधिक उपयुक्त हो सकता है * जो भी अपवाद * उठाया गया था। 'कोशिश करें ... को छोड़कर ...', यह अपवाद को संभालने की उम्मीद है, क्योंकि अब यह नहीं है, इसे फिर से हासिल करना एक और तरीका है। आईएमओ, 'आखिरकार' अधिक मजबूत है। – x0s

+1

@ x0s 'कोशिश करें ... आखिरकार ...' ब्लॉक, मेल प्रत्येक निष्पादित कोशिकाओं के लिए भेजा जाएगा; जो ओपी चाहता है वह नहीं है। लेकिन इसे पुन: पेश करना एक अच्छा विचार है। मैंने संपादित किया – show0k

2

मुझे नहीं लगता कि ऐसा करने के लिए एक बॉक्स ऑफ तरीका है जो आपकी कोशिकाओं में try..except कथन का उपयोग नहीं कर रहा है। AFAIK a 4 years old issue इसका उल्लेख करता है, लेकिन अभी भी खुली स्थिति में है।

हालांकि, runtools extension चाल चल सकता है।

4

@ show0k ने मेरे प्रश्न (जादू विधियों के संबंध में) का सही उत्तर दिया। आपका बहुत बहुत धन्यवाद! :)

उस उत्तर ने मुझे थोड़ा गहरा खोदने के लिए प्रेरित किया और मैं एक आईपीथॉन विधि में आया जो आपको पूरे नोटबुक के लिए कस्टम अपवाद हैंडलर परिभाषित करने देता है।

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 पर ध्यान दें: इस स्निपेट को एक छोटे पायथन मॉड्यूल में बनाएं जिसे नोटबुक में आयात किया जा सके और लाइन जादू के माध्यम से सक्रिय किया जा सके।

हालांकि सावधान रहें। प्रलेखन में इस set_custom_exc विधि के लिए एक चेतावनी है: "चेतावनी: अपने स्वयं के अपवाद हैंडलर को आईपीथन के मुख्य निष्पादन लूप में डालकर, आप बुरा क्रैश का बहुत अच्छा मौका चलाते हैं। यह सुविधा केवल तभी उपयोग की जानी चाहिए यदि आप वास्तव में जानते हैं कि आप क्या कर रहे हैं । "

संबंधित मुद्दे