Как поймать это исключение 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