LINUX.ORG.RU

python3 — как поймать exception модуля?

 ,


0

1

Привет.

Написал небольшую функцию для проверки соединения по sftp, добавил обработчик исключений, если соединение не происходит успешно:

def check_sftp_connection(port_sftp):
    '''try to authorized on CrushFTP via sftp and sownload file'''
    try:
       	print('1')
        transport = paramiko.Transport((args.ip, port_sftp))
       	print('2')
        transport.connect(username=args.username, password=args.password)
       	print('3')
        sftp_con = paramiko.SFTPClient.from_transport(transport)
       	print('4')
        if sftp_con.file('/hello', mode='r', bufsize=-1).read().decode().find("Hello")==-1:
       	    print('5')
            sftp_con.close()
            return "test file not found! Probably sftp protocol works incorrect!", 2
    except:
	return "CrushFTP is not available via sftp protocol", 2
    return '', 0

Как должно работать по моей задумке: если вызывается любое исключение — должен отработать «CrushFTP is not available via sftp protocol», 2

Но на деле иногда (при стечении определённых обстоятельств) получается вот это:

1
2
Exception: Error reading SSH protocol banner
Traceback (most recent call last):
  File "/usr/lib/python3.4/site-packages/paramiko/transport.py", line 1854, in _check_banner
    buf = self.packetizer.readline(timeout)
  File "/usr/lib/python3.4/site-packages/paramiko/packet.py", line 327, in readline
    buf += self._read_timeout(timeout)
  File "/usr/lib/python3.4/site-packages/paramiko/packet.py", line 497, in _read_timeout
    raise socket.timeout()
socket.timeout

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.4/site-packages/paramiko/transport.py", line 1710, in run
    self._check_banner()
  File "/usr/lib/python3.4/site-packages/paramiko/transport.py", line 1858, in _check_banner
    raise SSHException('Error reading SSH protocol banner' + str(e))
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

Critical error:  process uptime is too low... Only 8 sec; CrushFTP is not available via sftp protocol

Почему такое происходит? И как этого избежать? Я хочу обрабатывать все исключения.

Спасибо.

★★★

Последнее исправление: iljuase (всего исправлений: 1)
Ответ на: комментарий от peregrine

Я могу скопипастить код, конечно, но хотелось бы понять, как всё-таки реализовать обработку всех исключений, включая исключения модуля.

Чтобы в будущем не возникало таких проблем.

iljuase ★★★
() автор топика
Ответ на: комментарий от iljuase

Гугли по строчке

raise SSHException('Error reading SSH protocol banner' + str(e))

peregrine ★★★★★
()

P.S. мой код отрабатывает дальше, это исключение не вызывает крах скрипта, просто в консоль выводится исключение и всё.

Так что проблема не такая и критичная.

iljuase ★★★
() автор топика
Ответ на: комментарий от iljuase

Вопрос закрыт.

Ошибка просто выводится в stderr.

Убрать можно так:

import sys
sys.stderr = open('/dev/null', 'w')

или 2>/dev/null

iljuase ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.