Python правильный способ отловить исключения при закрытии файла - PullRequest
0 голосов
/ 08 ноября 2018

Я старый в Perl и новичок в Python. Я знаю в Perl, что fd.close () не имеет значения. При записи в полную файловую систему close () сообщит об ошибке. Также для ошибок сокетов они появляются в close (). Так как же это сделать в Python? В некоторых примерах показано размещение open () и close () в одном и том же блоке try, который может перехватить IOError. Но другие примеры показывают, что close () в блоке finally закрывает файл при исключении. Тем не менее, что, если исключение сначала происходит в close ()?

Охватывает ли это оба требования? (1) Всегда закрывать файл (2) Перехватить все исключения ввода-вывода?

try:
    with open(FILE, 'w') as fd:
        .....
except IOError as err:
    .....

Спасибо, Chris

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Ваш код правильный;он не может отличить ошибки в open от ошибок (неявных) close при выходе из блока with (и не отличать ошибки от любых других файловых операций в блоке), но он будет перехватывать все такие ошибки.К тому времени, когда вы достигнете блока except, вы гарантированно убедитесь, что файл пробовал до close (автоматическое закрытие with произойдет до того, как вы его достигнете, будь то в результате падения или исключенияповышается), хотя, если исключение произошло во время close, ваши возможности ограничены (потому что восстановление после сбоя close обычно невозможно,)

Обратите внимание, что IOError не совсем правильно;в Py3 он будет работать должным образом (это псевдоним OSError, который является фактическим базовым исключением, которое вы хотите перехватить), в то время как в Python 2 он отделен от OSError, что означает, что вы не поймаете OSError илиего подклассы (которые обычно наблюдаются в системах Windows в частности).

Если вы хотите, чтобы определенно перехватывал все такие ошибки переносимым образом, вы хотите перехватить EnvironmentError, который является суперклассомIOError и OSError на Python 2 и псевдоним для OSError на Python 3;если переносимость не имеет значения, то OSError - это имя, которое фактически используется в Py3, так что вы также можете использовать документированное имя.

0 голосов
/ 09 ноября 2018

Отметьте этот ответ , один комментарий говорит, что вы можете открыть файл отдельно, чтобы найти ошибку при открытии, а затем использовать его в качестве диспетчера контекста, повторив попытку так:

try:
    f = open( ... )
except IOError:
    ...
try:
    with f:
        ...
except IOError:
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...