Перехват исключения при использовании оператора Python 'with'
Оператор with был доступен без __future__
import начиная с Python 2.6 . Вы можете получить его как уже в Python 2.5 (но на данный момент пришло время обновить!) С:
from __future__ import with_statement
Вот самое близкое, что можно исправить. Вы почти у цели, но у with
нет предложения except
:
with open("a.txt") as f:
print(f.readlines())
except: # <- with doesn't have an except clause.
print('oops')
Метод __exit__
диспетчера контекста, если он вернет False
, вызовет ошибку по окончании. Если он вернет True
, он будет подавлен. Встроенный open
__exit__
не возвращает True
, поэтому вам нужно просто вставить его в попытку, кроме блока:
try:
with open("a.txt") as f:
print(f.readlines())
except Exception as error:
print('oops')
И стандартный шаблон: не используйте голый except:
, который ловит BaseException
и все другие возможные исключения и предупреждения. Будьте как минимум так же конкретны, как Exception
, и для этой ошибки, возможно, поймайте IOError
. Только ловить ошибки, которые вы готовы обрабатывать.
Так что в этом случае вы бы сделали:
>>> try:
... with open("a.txt") as f:
... print(f.readlines())
... except IOError as error:
... print('oops')
...
oops