मैं खिड़कियों पर लिख रहा हूँ अजगर 2.6.6 कोड है कि इस तरह दिखता है:मैं अजगर में कीबोर्ड इंटरप्ट को क्यों नहीं संभाल सकता?
try:
dostuff()
except KeyboardInterrupt:
print "Interrupted!"
except:
print "Some other exception?"
finally:
print "cleaning up...."
print "done."
dostuff()
एक समारोह है कि हमेशा के लूप होता है, एक इनपुट स्ट्रीम से एक समय में एक लाइन पढ़ने और उस पर कार्य है। जब मैं ctrl-c दबाता हूं तो मैं इसे रोकने और साफ़ करने में सक्षम होना चाहता हूं।
इसके बजाय क्या हो रहा है यह है कि except KeyboardInterrupt:
के तहत कोड बिल्कुल नहीं चल रहा है। केवल एक चीज प्रिंट हो जाती है कि "की सफाई ..." है, और फिर एक ट्रैस बैक छपा है कि इस तरह दिखता है:
Traceback (most recent call last):
File "filename.py", line 119, in <module>
print 'cleaning up...'
KeyboardInterrupt
तो, अपवाद हैंडलिंग कोड नहीं चल रहा है, और ट्रैस बैक का दावा है कि एक KeyboardInterrupt हुआ अंत में खंड के दौरान, जो समझ में नहीं आता है क्योंकि ctrl-c को मारना उस भाग को पहली जगह चलाने के कारण होता है! यहां तक कि सामान्य except:
खंड नहीं चल रहा है।
संपादित करें: टिप्पणियों के आधार पर, मैं sys.stdin.read साथ try:
ब्लॉक की सामग्री को बदल दिया()। समस्या अभी भी वर्णन की गई है, जैसा कि finally:
ब्लॉक की पहली पंक्ति के साथ चल रहा है और फिर उसी ट्रेसबैक को प्रिंट करना है।
संपादित करें # 2: यदि मैं पढ़ने के बाद बहुत कुछ जोड़ता हूं, हैंडलर काम करता है। तो, यह विफल रहता है:
try:
sys.stdin.read()
except KeyboardInterrupt:
...
लेकिन यह काम करता है:
try:
sys.stdin.read()
print "Done reading."
except KeyboardInterrupt:
...
यहाँ क्या मुद्रित है: "। पढ़ने हो गया"
Done reading. Interrupted!
cleaning up...
done.
तो, किसी कारण से, लाइन मुद्रित है, भले ही अपवाद पिछली पंक्ति पर हुआ। यह वास्तव में एक समस्या नहीं है - जाहिर है, मुझे "कोशिश" ब्लॉक के अंदर कहीं भी अपवाद को संभालने में सक्षम होना चाहिए। हालांकि, प्रिंट सामान्य रूप से काम नहीं करता है - यह बाद में एक नई लाइन मुद्रित नहीं करता है जैसा कि यह माना जाता है! "इंटरप्टेड" एक ही पंक्ति पर मुद्रित है ... इससे पहले एक जगह के साथ, किसी कारण से ...? वैसे भी, उसके बाद कोड वह करता है जो इसे माना जाता है।
ऐसा लगता है कि यह अवरुद्ध सिस्टम कॉल के दौरान बाधा को संभालने में एक बग है।
अपने dostuff() के लिए कोड दिखाएं, क्योंकि इस कोड को काम करना चाहिए (और यह करता है) – user225312
यह पाइथन 2.5.1 के साथ अपेक्षित काम करता है। – khachik
पायथन 2.7 के साथ पुन: उत्पन्न हुआ, 'sys.stdin.read()' – balpha