Найти - Пользователи
Полная версия: Обработка исключений через менеджеры контекстов...
Начало » Python для новичков » Обработка исключений через менеджеры контекстов...
1
mironich
Нужно много искл. однотипных обрабатывать.
Ниже пример того что я хочу сделать…
Только у меня блок обработки искл. очень большой.
И обработка некоторых искл. совпадает для вызовов нескольких разных методов.

from contextlib import contextmanager
@contextmanager
def tag():
	try:
		yield
	except ZeroDivisionError, e:
		print "!"
with tag():
    0 / 0
mironich
reclosedev
Вопроса не увидел.http://docs.python.org/3.4/library/contextlib.html#contextlib.ignoredhttp://hg.python.org/cpython/file/9046ef201591/Lib/contextlib.py#l143
Вопрос в том нормально ли так делать ?
reclosedev
mironich
И обработка некоторых искл. совпадает для вызовов нескольких разных методов.
Если обработка одинаковая, можно обернуть эти методы декоратором.

mironich
Вопрос в том нормально ли так делать ?
Из куска кода в вопросе не понятно как именно это сделано для нескольких методов.
mironich
Если обработка одинаковая, можно обернуть эти методы декоратором.
Была такая мысль…
НО это надо наследника лепить только ради того чтобы декораторы на методы прикрепить.
Вот там еще куча кода для обработки других искл.
    @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:
    #Тут вызов того что может выбросить искл.
reclosedev
Теперь более понятно. Нормальное решение, имхо.
mironich
reclosedev, во спасибо а то меня сомнения терзали не быдлокод ли это.
Единственный недостаток, что цикл туда нельзя вставить в код декоратора…
Тоесть если в цикле запросы выполнять до успешного завершения, в таких случаях декораторы юзаю.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB