Python: обработка исключений pysftp - PullRequest
0 голосов
/ 15 апреля 2020

Я использую pysftp с Python 3.7 для настройки клиентского скрипта SFTP.

Мой код (упрощенный и минимальный):

import pysftp
import sys

# Variables
destination_dir = 'BOGUS_DIR'
server = 'myserver.mydomain.com'
user = 'my_user'
key = 'my_key'
port = 22

# cnopts
mycnopts = pysftp.CnOpts()
mycnopts.log = True
mycnopts.compression = True
mycnopts.ciphers = None
mycnopts.hostkeys = None

try:
    with pysftp.Connection(server, username=user, private_key=key, port=port, cnopts=mycnopts) as sftp:
        try:
            with sftp.cd(destination_dir):
                print("OK cd worked")
        except:
            print("NOT OK cd failed")
            e = sys.exc_info()
            print("Exception: {0}".format(e))

        if sftp.isdir(destination_dir):
            print("OK isdir")
        else:
            print("NOT OK isdir")

except:
    print("Connection failure.")
    e = sys.exc_info()
    print("Exception: {0}".format(e))

Вывод: OK CD работал

Но я точно знаю, что BOGUS_DIR не существует. Это похоже на то, что pysftp не вызывает исключение на cd(), или я его улавливаю неправильно (следовательно, мой код python выполнен неправильно).

То же самое для isdir(), что бы я ни указывал в качестве параметра , он всегда возвращает True, даже если каталог не существует.

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

Неправильно ли обрабатывать исключения Pyftp , или мой код здесь виноват? Разве я не должен доверять pysftp и использовать Paramiko напрямую?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Хорошо, я понял, я думаю.

sftp.cd() не вызывает исключение, если каталог не существует. Делают только операции с плохим каталогом. Поэтому, если я изменю свой код следующим образом:

....
    try:
        with sftp.cd(destination_dir):
            sftp.listdir()
            print("OK ce worked")
    except:
        print("NOT OK cd failed")
        e = sys.exc_info()
        print("Exception: {0}".format(e))  

....

Таким образом, я получаю исключение, поскольку sftp.listdir() не может работать с несуществующим каталогом.

Почти как sftp.cd ничего не делает кроме установки значения текущего каталога, фактически ничего с ним не делая.

0 голосов
/ 15 апреля 2020

Если каталог не существует, вы получаете сообщение об ошибке из удаленной оболочки, где вы пытаетесь запустить команду. В этом коде вы пытаетесь отловить исключение, которое может быть вызвано только на sftp. Возможно, вам следует проверять код состояния, который должен возвращать модуль sftp после каждой выполненной команды оболочки

...