Найти - Пользователи
Полная версия: Не могу разобраться с exeptions
Начало » Python для новичков » Не могу разобраться с exeptions
1
devnull01
Доброго времени суток!
Не могу разобраться с перехватом исключений.
Код
def ssh_connect(host, username, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(host, port=22, username=username, password=password)
    except paramiko.ssh_exception.BadAuthenticationType:
        print(logbadhost + host + " is not accept passwors")
        logger.log(3, logbadhost + host + " is not accept passwors")
        return 2
    except paramiko.ssh_exception.AuthenticationException:
        logger.log(2, logbadpass + username + "@" + host + ":" + password)
        return 1
    except paramiko.ssh_exception.SSHException:
        logger.log(3, logbadhost + host + " is ebnytii kakoito")
        return 2
    except socket.timeout:
        logger.log(3, logbadhost + host + " is down")
        return 2
    except socket.error as e:
        # print(e)
        return
    except ConnectionRefusedError as e:
        # print(e)
        logger.log(3, logbadhost + host + " is ebnytii kakoito")
        return 2
    except EOFError as e:
        # print(e)
        logger.log(3, logbadhost + host + " is ebnytii kakoito")
        return 2
    except:
        return 2
    else:
        print(loggoodpass + username + "@" + host + ":" + password)
        logger.log(4, loggoodpass + username + "@" + host + ":" + password)
        return 0
    finally:
        ssh.close()

Вроде в try обернул, но все равно пишет

Exception: Error reading SSH protocol banner Bad file descriptor
Traceback (most recent call last):
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1707, in _check_banner
buf = self.packetizer.readline(timeout)
File “/usr/local/lib/python3.4/dist-packages/paramiko/packet.py”, line 281, in readline
buf += self._read_timeout(timeout)
File “/usr/local/lib/python3.4/dist-packages/paramiko/packet.py”, line 434, in _read_timeout
x = self.__socket.recv(128)
OSError: Bad file descriptor

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1584, in run
self._check_banner()
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1711, in _check_banner
raise SSHException('Error reading SSH protocol banner' + str(e))
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner Bad file descriptor

Заранее спасибо за помощь!
JOHN_16
В трейсбеке не указана исходная строчка кода в которой произошла ошибка. М.б. ошибка происходит за конструкцией try? ибо выглядит все корректно
devnull01
Проблема, насколько я понимаю, кроется в библиотеке paramiko. Она используется только в этой функции, а она (функция) вся в try. Если попробовать подключиться к хосту через встроенный ssh клиент, возникает ошибка “подключение сброшено”.

Еще бывают вот такие ошибки:
Exception: Error reading SSH protocol banner Connection reset by peer
Traceback (most recent call last):
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1707, in _check_banner
buf = self.packetizer.readline(timeout)
File “/usr/local/lib/python3.4/dist-packages/paramiko/packet.py”, line 281, in readline
buf += self._read_timeout(timeout)
File “/usr/local/lib/python3.4/dist-packages/paramiko/packet.py”, line 434, in _read_timeout
x = self.__socket.recv(128)
ConnectionResetError: Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1584, in run
self._check_banner()
File “/usr/local/lib/python3.4/dist-packages/paramiko/transport.py”, line 1711, in _check_banner
raise SSHException('Error reading SSH protocol banner' + str(e))
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner Connection reset by peer

Но как так может произойти? Ведь все вызовы paramiko обернуты в try?

JOHN_16
Я смог воспроизвести ошибку. Для этого в качестве порта указал порт ftp сервера. Ситуация такая - try except отрабатывают. Функция возвращает код завершения. Однако, происходит с точки зрения интерпретатора неординарная ситуация - во время исключительной ситуации возбуждает другое исключение. Интерпретатор спешит об этом сообщить на стандартный поток ошибок. Собственно это вы и видите. Т.о. все в порядке и вы можете выполнять свой код далее.
Если вам прям вот надо от этого избавиться…то это уже другой вопрос.
devnull01
возможно ли как то получить этот самый exeption, что бы знать, что неверно указан порт? да и от вывода было бы избавиться не плохо (но не просто заткнуть, а перехватить как нибудь)
JOHN_16
devnull01
от вывода было бы избавиться не плохо (но не просто заткнуть, а перехватить как нибудь)
вы можете оперировать внутри программы потоками вывода. Для этого наверняка подойдет любой файло-подобный объект. Для linux например вполне корректно делать так:
>>> import sys
>>> _s = sys.stderr
>>> sys.stderr = open('/dev/null', 'w')
>>> 
>>> print('qwe')
qwe
>>> 1/0
>>> 
>>> sys.stderr = _s
>>> 
>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> 
devnull01
Возможно ли как то получить этот самый exeption, что бы знать, что неверно указан порт?
Для работы с исключениями есть модуль traceback, там весь необходимый функционал есть.
devnull01
спасибо большое!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB