Ваш код правильный;он не может отличить ошибки в 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, так что вы также можете использовать документированное имя.