Python - Пока верно: попробуйте, кроме прочего - Вопрос о выполнении программы - PullRequest
1 голос
/ 22 января 2020

У меня есть этот код, используя While True с try catch. Последний оператор else всегда выполняется, когда попытка успешна, и я хотел бы понять, почему - я думаю, что я не правильно понимаю ход выполнения программы.

while True:
    try:
        subprocess.call(["wget", "-O", "splunk-8.0.1-6db836e2fb9e-Linux-x86_64.tgz", "https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.1&product=splunk&filename=splunk-8.0.1-6db836e2fb9e-Linux-x86_64.tgz&wget=true"])
        print("successfully downloaded splunk enterprise")
        time.sleep(2)
    except OSError as e:
        if e.errno == 2:
            print(e)
            print("wget doesn't seem to be installed")
            time.sleep(2)
            print("attempting to install wget")
            time.sleep(2)
            subprocess.call(["yum", "install", "wget"])
        else:
            print(e)
            print("unknown error response, exiting...")
            break
    else:
        print("something else went wrong while trying to download splunk")
        break

Ответы [ 3 ]

1 голос
/ 22 января 2020

на основе python документации , try-exc может принимать необязательный оператор else:

В операторе try… кроме есть необязательное условие else, которое при его наличии , должны следовать всем, кроме пунктов. Это полезно для кода, который должен быть выполнен, если предложение try не вызывает исключение.

, поэтому на основании этого ваш оператор else будет выполняться, если код в try не вызывает никакого исключения!

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

while True:
    try:
        subprocess.call(["wget", "-O", "splunk-8.0.1-6db836e2fb9e-Linux-x86_64.tgz", "https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.1&product=splunk&filename=splunk-8.0.1-6db836e2fb9e-Linux-x86_64.tgz&wget=true"])
        print("successfully downloaded splunk enterprise")
        time.sleep(2)
    except OSError as e:
        if e.errno == 2:
            print(e)
            print("wget doesn't seem to be installed")
            time.sleep(2)
            print("attempting to install wget")
            time.sleep(2)
            subprocess.call(["yum", "install", "wget"])
        else:
            print(e)
            print("unknown error response, exiting...")
            break
    except:
        print("something else went wrong while trying to download splunk")
        break


0 голосов
/ 22 января 2020

Начиная с здесь :

Оператор try… кроме имеет необязательное условие else, которое, если оно присутствует, должно следовать за всеми, кроме предложений. Это полезно для кода, который должен быть выполнен, если предложение try не вызывает исключение.

Таким образом, предложение else будет выполняться, если код в блоке try выполняется успешно.

0 голосов
/ 22 января 2020

Предложение else для try выполняется, если код внутри try did not выдает исключение. Если вы хотите перехватить какое-либо исключение, используйте except без указания класса исключения:

except:
    print("something else went wrong while trying to download splunk")
    break

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

...