Есть ли в Python что-то вроде try-finally, кроме того, что оно обычно вызывает исключения нормально? - PullRequest
0 голосов
/ 25 апреля 2019

Предположим, я хочу запустить некоторую функцию в Python, гарантируя, что независимо от того, происходит ли сбой или нет, всегда выполняется какой-либо код очистки.Примерно так:

try: some_function()
finally: cleanup()

Ладно, достаточно просто.Но держись!Если в блоке try возникнут какие-либо исключения, они будут подавлены. Так что на самом деле эта конструкция на больше , чем я хотел.Все, что я действительно хотел сделать, это убедиться, что какой-то код очистки запускается после функции, независимо от того, успешно она завершается или нет.Я все еще хочу, чтобы любые исключения, возникающие в моей функции, происходили нормально . Возможно, это выглядело бы примерно так:

do: some_function()
finally: cleanup()

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

try: some_function()
except Exception as error: raise error
finally: cleanup()

Eww, брутто.Я добавляю дополнительную строку к re-throw исключение, которое я хотел, чтобы это происходило обычно в первую очередь.Кроме того, в трассировке стека добавлена ​​дополнительная строка, показывающая бит except Exception as error: raise error.Мне это кажется не совсем идеальным, но это также единственный способ достичь того, что я пытаюсь сделать.

Так что, на самом деле, я должен так поступить?

Если да, то у меня есть еще один вопрос: Почему у Python нет выделенной конструкции для простого обеспечения выполнения какого-либо блока кода независимо от того, успешно выполняется какой-либо другой блок или нет?

Что касается моего маленького ума, вся эта идея не имеет ничего общего с обработкой исключений, поскольку я на самом деле не хочу, чтобы исключения возникали там, где они обычно бывают в трассировке стека.Поэтому принуждение людей использовать конструкцию try-then-finally мне кажется странным.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Python делает !

try:
    1/0
finally:
    print("Hello, world!")
print("This will not print.")
0 голосов
/ 25 апреля 2019

Хорошо, так как @ user2357112 указал, похоже, у меня почему-то было дикое заблуждение, что часть try конструкции try-exc-finally - это то, что ловит исключения.Если кто-то еще запутается подобным образом, то , за исключением бита, отлавливает.Довольно очевидно после некоторого размышления, но эй, у всех иногда бывает пукающий мозг.

...