2016-02-23 9 views
8

सभी दस्तावेज़ बता हमें है,Python में कीबोर्ड इंटरप्ट कब उठाया गया है?

उठाया है जब उपयोगकर्ता बाधा कुंजी (सामान्य रूप से Control-C या Delete) पूरी करता है। निष्पादन के दौरान, इंटरप्ट के लिए नियमित रूप से जांच की जाती है।

लेकिन कोड के बिंदु से , मुझे यह अपवाद कब दिखाई दे सकता है? क्या यह कथन निष्पादन के दौरान होता है? केवल बयानों के बीच? क्या यह अभिव्यक्ति के बीच में हो सकता है?

उदाहरण के लिए:

file_ = open('foo') 
# <-- can a KeyboardInterrupt be raised here, after the successful 
# completion of open but prior to the try? --> 
try: 
    # try some things with file_ 
finally: 
    # cleanup 

विल एक अच्छी तरह से समय समाप्त हो गया KeyboardInterrupt के दौरान इस कोड रिसाव? या यह कुछ बयानों या अभिव्यक्तियों के निष्पादन के दौरान उठाया गया है?

उत्तर

1

हां, KeyboardInterrupt आपके द्वारा चिह्नित स्थान पर हो सकता है।

इस समस्या से निपटने के लिए, आप एक with ब्लॉक का उपयोग करना चाहिए:

with open('foo') as file_: 
    # do some things 
    raise KeyboardInterrupt 

# file resource is closed no matter what, even if a KeyboardInterrupt is raised 

हालांकि, अपवाद भी open() कॉल और file_ असाइनमेंट के बीच हो सकता है। शायद इसके बारे में चिंता करने योग्य नहीं है, क्योंकि आमतौर पर ctrl-c का अर्थ यह होगा कि आपका प्रोग्राम समाप्त होने वाला है, इसलिए "लीक" फ़ाइल हैंडल ओएस द्वारा साफ किया जाएगा। लेकिन यदि आप जानते हैं कि यह महत्वपूर्ण है, तो आप कीबोर्ड इन्टरप्टा (SIGINT) को बढ़ाने वाले सिग्नल को पकड़ने के लिए a signal handler का उपयोग कर सकते हैं।

+0

दुर्भाग्य से, 'साथ' हमेशा संभव नहीं होता है; कभी-कभी आप देखना चाहते हैं कि '__enter__' को कॉल करने से पहले क्या कथन में अभिव्यक्ति विफल हो जाती है (उदा।, क्या यह एक विशेष विस्तार बढ़ाता है?)। आप इसे 'साथ' के साथ नहीं कर सकते हैं, क्योंकि आप 'साथ' के शरीर को लपेटे बिना अभिव्यक्ति को लपेटने की क्षमता खो देते हैं। (जो, यदि यह अभिव्यक्ति के समान प्रकार के अपवाद को बढ़ा सकता है, तो इसका मतलब है कि आप उन्हें 'छोड़कर' में अलग नहीं कर सकते हैं।) – Thanatos

4

असंबंधित PEP 343 में एक नोट के अनुसार:

भले ही आप बग-मुक्त कोड लिखने, एक KeyboardInterrupt अपवाद अभी भी यह किसी भी दो आभासी मशीन opcodes के बीच बाहर निकलने के लिए हो सकता है।

तो यह अनिवार्य रूप से कहीं भी हो सकता है। यह वास्तव में एक अभिव्यक्ति के मूल्यांकन के दौरान हो सकता है। (यह आश्चर्यजनक नहीं होना चाहिए, क्योंकि एक अभिव्यक्ति में फ़ंक्शन कॉल शामिल हो सकते हैं, और फ़ंक्शन कॉल के अंदर बहुत कुछ भी हो सकता है।)

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