में टूटे हुए पाइप को पकड़ें मैं टूटी हुई पाइप त्रुटि को पकड़ने के लिए कुछ कोड लिखने का प्रयास करता हूं। कोड पायथन 2.x और पायथन 3.x में चलाना चाहिए।पाइथन 2 और पायथन 3
अजगर 2.xa टूटी हुई पाइप में एक socket.error
socket.error: [Errno 32] Broken pipe
यह अजगर 3.x में बदल गया था का प्रतिनिधित्व करती है - एक टूटी हुई पाइप अब एक BrokenPipeError
BrokenPipeError: [Errno 32] Broken pipe
भी की वाक्य रचना है अपवाद हैंडलिंग थोड़ा बदल गया है (https://stackoverflow.com/a/34463112/263589 देखें) तो मुझे क्या करना होगा:
try:
do_something()
except BrokenPipeError as e: # implies Python 3.x
resolve_for_python2()
except socket.error as e:
if sys.version_info[0] == 2: # this is necessary, as in Python >=3.3
# socket.error is an alias of OSError
# https://docs.python.org/3/library/socket.html#socket.error
resolve_for_python3()
else:
raise
वहां (कम से कम) एक शेष समस्या है: पायथन 2.x में BrokenPipeError
नहीं है, इसलिए जब भी do_something()
में कोई अपवाद होता है तो Python 2.x एक और अपवाद फेंक देगा और शिकायत करेगा कि यह BrokenPipeError
नहीं जानता है। socket.error
को पायथन 3.x में बहिष्कृत किया गया है इसी तरह की समस्या निकट भविष्य में पायथन 3.x में उत्पन्न हो सकती है।
यह कोड पायथन 2.x और पायथन 3.x में चलाने के लिए मैं क्या कर सकता हूं?
http://python-future.org/compatible_idioms.html पर एक नज़र डालें, वे अपवाद हैंडलिंग दिखाते हैं। – MKesper
http://newbebweb.blogspot.in/2012/02/python-head-ioerror-errno-32-broken.html यहां –
धन्यवाद! लेकिन http://python-future.org/compatible_idioms.html#catching-exceptions यह बताता नहीं है कि अपवाद को कैसे पकड़ें जो कि पाइथन 2 या पायथन 3 में मौजूद नहीं है लेकिन दूसरे संस्करण में अनिवार्य है। – speendo