Tôi cố gắng viết một số mã để bắt lỗi hỏng ống. Mã nên chạy trong Python 2.x và Python 3.x.Bắt ống bị hỏng trong Python 2 và Python 3
Trong Python 2.xa ống vỡ được đại diện bởi một socket.error
socket.error: [Errno 32] Broken pipe
này được thay đổi bằng Python 3.x - một đường ống bị hỏng bây giờ là một BrokenPipeError
BrokenPipeError: [Errno 32] Broken pipe
Ngoài ra cú pháp của xử lý ngoại lệ đã thay đổi một chút (xem https://stackoverflow.com/a/34463112/263589) vì vậy những gì tôi cần làm sẽ là một cái gì đó như:
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
Có
Có (ít nhất) một vấn đề còn lại: Trong Python 2.x không có BrokenPipeError
, vì vậy bất cứ khi nào có ngoại lệ trong do_something()
Python 2.x sẽ ném một ngoại lệ khác và khiếu nại rằng nó không biết BrokenPipeError
. Vì socket.error
không còn được dùng trong Python 3.x, một vấn đề tương tự có thể phát sinh trong Python 3.x trong tương lai gần.
Tôi có thể làm gì để làm cho mã này chạy trong Python 2.x và Python 3.x?
Hãy xem http://python-future.org/compatible_idioms.html, chúng hiển thị xử lý ngoại lệ. – MKesper
http://newbebweb.blogspot.in/2012/02/python-head-ioerror-errno-32-broken.html đây là –
Cảm ơn bạn! Nhưng http://python-future.org/compatible_idioms.html#catching-exceptions không giải thích cách bắt một ngoại lệ không tồn tại trong Python 2 hoặc Python 3 nhưng là bắt buộc trong phiên bản khác. – speendo