Как мне поймать все исключения в общем классе, как миксин - PullRequest
0 голосов
/ 11 октября 2018

У меня есть представления на основе классов в приложении Python Django.Большинство из них обрабатывают исключения одного типа, например:

class A{
    try:
        func1()
    except type1 as e:
        handle1()
    except type2 as e:
        handle()
}

class B{
    try:
        func2()
        func3()
    except type1 as e:
        handle1()
    except type2 as e:
        handle()
}

Я бы хотел оставить обработку этого исключения в общем классе (может быть миксином).Какой класс требует обработки исключений, унаследует общий класс.

Сохраните повторную обработку исключений в общем классе. Я использую python3 и django1.11 - представления на основе классов

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Если вы используете базовые представления класса django, вы можете переопределить dispatch и создать миксин.В основанном на классах django методе отправки диспетчер принимает запрос и в конечном итоге возвращает ответ.

Вы можете сделать это следующим образом -

class ExceptionHandlingMixin(object):
    def dispatch(self, request, *args, **kwargs):
        try:
            func1()
        except type1 as e:
            handle()
        except type2 as e:
            handle()
        return super(ExceptionHandlingMixin, self).dispatch(request, *args, **kwargs)

Изменить это по-своему.Для ознакомления посетите документацию .

0 голосов
/ 11 октября 2018

Вы можете извлечь обработку исключений в базовый класс и изменить реализацию в производных классах:

In [15]: import abc

In [16]: class Base:
    ...:     def run(self):
    ...:         try:
    ...:             self.do_run()
    ...:         except:
    ...:             print('failed')
    ...:
    ...:     @abc.abstractmethod
    ...:     def do_run(self):
    ...:         ...
    ...:

In [17]: class Foo(Base):
    ...:     def do_run(self):
    ...:         print('run foo')
    ...:

In [18]: class Bar(Base):
    ...:     def do_run(self):
    ...:         print('fail bar')
    ...:         raise Exception()
    ...:

In [19]: f = Foo()

In [20]: f.run()
run foo

In [21]: b = Bar()

In [22]: b.run()
fail bar
failed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...