Как поймать это исключение Python: ошибка: [Errno 10054] Существующее соединение было принудительно закрыто удаленным хостом
Я пытаюсь поймать это конкретное исключение (и только это исключение) в Python 2.7, но я не могу найти документацию по классу исключений. Есть один?
[Errno 10054] An existing connection was forcibly closed by the remote host
Мой код:
try:
# Deleting filename
self.ftp.delete(filename)
return True
except (error_reply, error_perm, error_temp):
return False
except # ?? What goes here for Errno 10054 ??
reconnect()
retry_action()
Ответы
Ответ 1
Тип ошибки - socket.error, документация здесь.
Попробуйте изменить свой код следующим образом:
import socket
import errno
try:
Deleting filename
self.ftp.delete(filename)
return True
except (error_reply, error_perm, error_temp):
return False
except socket.error as error:
if error.errno == errno.WSAECONNRESET:
reconnect()
retry_action()
else:
raise
Ответ 2
Вы можете попробовать сделать что-то вроде:
try:
# Deleting filename
self.ftp.delete(filename)
return True
except (error_reply, error_perm, error_temp):
return False
except Exception, e:
print type(e) # Should give you the exception type
reconnect()
retry_action()
Ответ 3
Если вы хотите отфильтровать исключения, первым шагом будет выяснить тип исключения и добавить его в условие except. Это обычно легко, потому что python распечатает его как часть трассировки. Вы не упомянули тип, но он выглядит как socket.gaierror для меня, поэтому я собираюсь с этим.
Следующий шаг - выяснить, что интересно внутри исключения. В этом случае `help (socket.gaierror) 'делает трюк: есть поле с именем errno, которое мы можем использовать, чтобы выяснить, какие ошибки мы хотим фильтровать.
Теперь измените свой код так, чтобы исключение попало в цикл повтора.
import socket
retry_count = 5 # this is configured somewhere
for retries in range(retry_count):
try:
# Deleting filename
self.ftp.delete(filename)
return True
except (error_reply, error_perm, error_temp):
return False
except socket.gaierror, e:
if e.errno != 10054:
return False
reconnect()
return False