как игнорировать и пропустить ошибку Python sftp - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть Python код, который создает скриншот рабочего стола (png) и сохраняет его локально, затем подключается через sftp к удаленному серверу и обновляет файл скриншота удаленно. используя sftp. Это работает отлично, однако, если удаленный сервер sftp выключается, сценарии заканчиваются ошибкой. Как игнорировать и пропустить ошибку, если sftp удаленного сервера отключается, я хочу, чтобы скрипт не останавливался и вместо этого сохранял файл локально.

import mss
import mss.tools
import datetime
import time
import pysftp as sftp


count = 0
while count < 100000000:
    with mss.mss() as sct:
        monitor = sct.monitors[1]
        timestr = time.strftime("%Y%m%d-%H%M%S")
        sct.compression_level = -1
        output = "d:/screen/work/" + (timestr) + ".png".format(**monitor)
        sct_img = sct.grab(monitor)
        mss.tools.to_png(sct_img.rgb, sct_img.size, output=output)
        print(output)   
        s = sftp.Connection(host='127.0.0.1', username='admin', password='********')
        local_path = "" +(output)+ ""
        remote_path = ""
        s.put(local_path, remote_path)
        s.close()


    time.sleep(10)
    count += 1

Я пробовал это

import mss
import mss.tools
import datetime
import time
import pysftp as sftp


count = 0
while count < 100000000:
    with mss.mss() as sct:
        monitor = sct.monitors[1]
        timestr = time.strftime("%Y%m%d-%H%M%S")
        sct.compression_level = -1
        output = "d:/screen/work/" + (timestr) + ".png".format(**monitor)
        sct_img = sct.grab(monitor)
        mss.tools.to_png(sct_img.rgb, sct_img.size, output=output)
        print(output)  
        try:
    s = sftp.Connection(host='127.0.0.1', username='admin', password='********')
 except:
    print("Couldn't connect to ftp")
    return False 
        local_path = "" +(output)+ ""
        remote_path = ""
        s.put(local_path, remote_path)
        s.close()


    time.sleep(10)
    count += 1

, но возвращает эту ошибку

  s = sftp.Connection(host='127.0.0.1', username='admin', password='******')
    ^
IndentationError: expected an indented block

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Заключение вашего соединения в блок try ... except, как это позволит вам обработать ошибку, не прерывая программу в процессе:

# first part of your code here
try:
    s = sftp.Connection(host='127.0.0.1', username='admin', password='********')
    local_path = "" +(output)+ ""
    remote_path = ""
    s.put(local_path, remote_path)
    s.close()
except Exception as e:
    # do something with e here, e.g. print a log statement
    # your code for saving a local copy goes here as well
# rest of your code goes here

Обратите внимание, что вы должны заменить мой generi c Exception из-за ошибки соединения, которую вы получаете, чтобы не игнорировать что-либо еще, что может go быть неправильным при подключении и передаче данных, поскольку другие ошибки, вероятно, не могут быть проигнорированы так же легко

1 голос
/ 06 февраля 2020

Блок try....except можно использовать для перехвата всех исключений, подобных этому:

import mss
import mss.tools
import datetime
import time
import pysftp as sftp


count = 0
while count < 100000000:
    with mss.mss() as sct:
        monitor = sct.monitors[1]
        timestr = time.strftime("%Y%m%d-%H%M%S")
        sct.compression_level = -1
        output = "d:/screen/work/" + (timestr) + ".png".format(**monitor)
        sct_img = sct.grab(monitor)
        mss.tools.to_png(sct_img.rgb, sct_img.size, output=output)

        print(output)

        try:
            s = sftp.Connection(host="127.0.0.1", username="admin", password="********")
            local_path = "" + (output) + ""
            remote_path = ""
            s.put(local_path, remote_path)
            s.close()

        except:
            print("Couldn't connect to ftp")

        return False

    time.sleep(10)
    count += 1

Однако не рекомендуется перехватывать все исключения вслепую. Вы должны проверить, какие исключения возникают при возникновении ошибок, и использовать их, в частности, следующим образом:

try:
    "...your code block that might raise en error..."
except ZeroDivisionError:
    print("Zero division error occurred")

except ValueError:
    print("Value error occured")

Однако, если вы не можете предсказать, какая ошибка может появиться, и вам нужно несколько слепо отлавливать исключения, тогда по крайней мере, сделать logging. Вы можете увидеть больше информации об ловле и регистрации исключений здесь.

...