Есть ли способ перехватывать исключения в методе __enter__
контекстного менеджера, не заключая весь блок with
в try
?
class TstContx(object):
def __enter__(self):
raise Exception("I'd like to catch this exception")
def __exit__(self, e_typ, e_val, trcbak):
pass
with TstContx():
raise Exception("I don't want to catch this exception")
pass
Я знаю, что могу перехватить исключение внутри самого __enter__()
, но могу ли я получить доступ к этой ошибке из функции, содержащей оператор with
?
На первый взгляд вопрос перехват исключения в диспетчере контекста __enter__()
кажется таким же вещь, но этот вопрос на самом деле касается того, чтобы убедиться, что __exit__
вызывается, а не с обработкой кода __enter__
иначе, чем блок, который заключает оператор with
.
...видимо мотивация должна быть яснее. Оператор with
настраивает регистрацию для полностью автоматизированного процесса. Если программа дает сбой до того, как будет настроено ведение журнала, я не могу полагаться на ведение журнала, чтобы уведомить меня, поэтому я должен сделать что-то особенное. И я бы предпочел добиться эффекта без добавления дополнительных отступов, например:
try:
with TstContx():
try:
print "Do something"
except Exception:
print "Here's where I would handle exception generated within the body of the with statement"
except Exception:
print "Here's where I'd handle an exception that occurs in __enter__ (and I suppose also __exit__)"
Еще одним недостатком использования двух блоков try
является то, что код, обрабатывающий исключение в __enter__
, идет после кода, обрабатывающего исключение в последующем теле блока with
.
__enter__
исключения отдельно отwith
исключений тела - person jfs   schedule 21.09.2015