Próbuję napisać kod, aby złapać błąd zepsutej rury. Kod powinien działać w Pythonie 2.x i Pythonie 3.x.Złapać przerwaną rurę w Pythonie 2 I Pythonie 3
Pythona 2.xa pęknięcia przewodu jest reprezentowany przez socket.error
socket.error: [Errno 32] Broken pipe
to zmieniono w Pythonie 3.x - złamany rury teraz jest BrokenPipeError
BrokenPipeError: [Errno 32] Broken pipe
również składnia obsługa wyjątków zmieniła się nieco (zob. https://stackoverflow.com/a/34463112/263589), więc potrzebuję czegoś takiego:
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
Istnieje (przynajmniej) jeden pozostały problem: w Pythonie 2.x nie ma numeru BrokenPipeError
, więc w przypadku wyjątku w do_something()
Python 2.x rzuciłby inny wyjątek i narzekałby, że nie zna BrokenPipeError
. Ponieważ socket.error
jest przestarzałe w Pythonie 3.x, podobny problem może pojawić się w Pythonie 3.x w najbliższej przyszłości.
Co mogę zrobić, aby ten kod działał w Pythonie 2.x i Pythonie 3.x?
Zobacz http://python-future.org/compatible_idioms.html, wyświetlają obsługę wyjątku. – MKesper
http://newbebweb.blogspot.in/2012/02/python-head-ioerror-errno-32-broken.html tutaj jest –
Dziękujemy! Ale http://python-future.org/compatible_idioms.html#catching-exceptions nie wyjaśnia, jak uchwycić wyjątek, który nie istnieje ani w Pythonie 2, ani w Pythonie 3, ale jest obowiązkowy w drugiej wersji. – speendo