Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 28, 2013 07:35:49

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Обработка исключений через менеджеры контекстов...

Нужно много искл. однотипных обрабатывать.
Ниже пример того что я хочу сделать…
Только у меня блок обработки искл. очень большой.
И обработка некоторых искл. совпадает для вызовов нескольких разных методов.

from contextlib import contextmanager
@contextmanager
def tag():
	try:
		yield
	except ZeroDivisionError, e:
		print "!"
with tag():
    0 / 0



Офлайн

#2 Июнь 28, 2013 16:35:30

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Обработка исключений через менеджеры контекстов...

Офлайн

#3 Июнь 29, 2013 02:41:07

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Обработка исключений через менеджеры контекстов...

reclosedev
Вопроса не увидел.http://docs.python.org/3.4/library/contextlib.html#contextlib.ignoredhttp://hg.python.org/cpython/file/9046ef201591/Lib/contextlib.py#l143
Вопрос в том нормально ли так делать ?



Офлайн

#4 Июнь 29, 2013 08:33:50

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Обработка исключений через менеджеры контекстов...

mironich
И обработка некоторых искл. совпадает для вызовов нескольких разных методов.
Если обработка одинаковая, можно обернуть эти методы декоратором.

mironich
Вопрос в том нормально ли так делать ?
Из куска кода в вопросе не понятно как именно это сделано для нескольких методов.

Офлайн

#5 Июнь 29, 2013 09:18:26

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Обработка исключений через менеджеры контекстов...

Если обработка одинаковая, можно обернуть эти методы декоратором.
Была такая мысль…
НО это надо наследника лепить только ради того чтобы декораторы на методы прикрепить.
Вот там еще куча кода для обработки других искл.
    @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:
    #Тут вызов того что может выбросить искл.



Офлайн

#6 Июнь 29, 2013 12:28:24

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Обработка исключений через менеджеры контекстов...

Теперь более понятно. Нормальное решение, имхо.

Офлайн

#7 Июнь 29, 2013 12:41:09

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Обработка исключений через менеджеры контекстов...

reclosedev, во спасибо а то меня сомнения терзали не быдлокод ли это.
Единственный недостаток, что цикл туда нельзя вставить в код декоратора…
Тоесть если в цикле запросы выполнять до успешного завершения, в таких случаях декораторы юзаю.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version