Форум сайта python.su
2
Нужно много искл. однотипных обрабатывать.
Ниже пример того что я хочу сделать…
Только у меня блок обработки искл. очень большой.
И обработка некоторых искл. совпадает для вызовов нескольких разных методов.
from contextlib import contextmanager @contextmanager def tag(): try: yield except ZeroDivisionError, e: print "!" with tag(): 0 / 0
Офлайн
173
Офлайн
2
reclosedevВопрос в том нормально ли так делать ?
Вопроса не увидел.http://docs.python.org/3.4/library/contextlib.html#contextlib.ignoredhttp://hg.python.org/cpython/file/9046ef201591/Lib/contextlib.py#l143
Офлайн
173
mironichЕсли обработка одинаковая, можно обернуть эти методы декоратором.
И обработка некоторых искл. совпадает для вызовов нескольких разных методов.
mironichИз куска кода в вопросе не понятно как именно это сделано для нескольких методов.
Вопрос в том нормально ли так делать ?
Офлайн
2
Если обработка одинаковая, можно обернуть эти методы декоратором.
@contextmanager def _handleNwtworckErrorContext(self): try: yield except http.BadHttpCode as e: if e.code == 500: logging.warning("Проблемы на серверах ВК следующая" "попытка выполнить запрос через 30 сек.") time.sleep(30) elif e.code == 503: logging.warning("Сервер ВК лежит следующая попытка" "выполнить запрос через 30 сек.") time.sleep(30) elif e.code == 404: logging.warning("ВК сменили API останавливаем поток") self.stop = True else: logging.warning("Получен необрабатываемый HTTP код(%i)" "для url: %s повторяем попытку через 5 сек" % (e.code, e.url)) time.sleep(5)
with self._handleNwtworckErrorContext: #Тут вызов того что может выбросить искл.
Офлайн
173
Теперь более понятно. Нормальное решение, имхо.
Офлайн
2
reclosedev, во спасибо а то меня сомнения терзали не быдлокод ли это.
Единственный недостаток, что цикл туда нельзя вставить в код декоратора…
Тоесть если в цикле запросы выполнять до успешного завершения, в таких случаях декораторы юзаю.
Офлайн