Предположим, я хочу запустить некоторую функцию в 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 мне кажется странным.