Очистка объекта только в случае возникновения исключения - PullRequest
3 голосов
/ 07 октября 2011

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

Лучшее, что я смог придумать, это:

try:
    file_path = "whatever.jpg"
    # do stuff with file
except:
    exception_raised = True
    raise
finally:
    try:
        if exception_raised:
            os.unlink(file_path)
    except:
        pass

return file_path   # everything OK

Кто-нибудь знает о лучшем, более питонском подходе?

1 Ответ

5 голосов
/ 07 октября 2011

Другой вариант - просто сохранить исключение, если вы не хотите его потерять:

Версия Python 3.x:

try:
    file_path = "whatever.jpg"
    # do stuff with file
except BaseException as e:
    try:
        os.unlink(file_path)
    except Exception:
        traceback.print_exc()
    raise e

Версия Python 2.x немногоболее сложный, поскольку вам нужно хранить полную информацию об исключении вручную (в противном случае вы потеряете трассировку):

try:
    file_path = "whatever.jpg"
    # do stuff with file
except:
    e = sys.exc_info()
    try:
        os.unlink(file_path)
    except Exception:
        traceback.print_exc()
    raise e[0], e[1], e[2]

Редактировать : перехватывать только подклассы Exception во внутреннем *Блок 1012 *, так как вы не хотите здесь ловить SystemExit или KeyboardInterrupt.Также сообщайте о любом исключении, которое произошло во время отмены соединения, вместо того, чтобы просто отбрасывать его.

...