我如何在一个常见的 class 中捕获所有异常,比如 mixin
How do I catch all exception in a common class like a mixin
我在 python django 应用程序中有基于 class 的视图。他们中的大多数处理相同类型的异常,如:
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()
}
我想将此异常处理保留在一个通用的 class(可能是一个 mixin)中。 class需要异常处理的会继承普通的class.
使用 python3 和 django1.11 - 基于 class 的视图
将重复的异常处理保持在公共 class.I 中
您可以将异常处理提取到基础 class 并在派生的 classes 中更改实现:
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
如果您使用的是 django class 基础视图,您可以重写 dispatch
并创建一个 mixin。在 django 中,基于 class 的视图调度方法接收请求并最终 returns 响应。
你可以这样做 -
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)
按您的方式修改。参考访问 documentation.
我在 python django 应用程序中有基于 class 的视图。他们中的大多数处理相同类型的异常,如:
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()
}
我想将此异常处理保留在一个通用的 class(可能是一个 mixin)中。 class需要异常处理的会继承普通的class.
使用 python3 和 django1.11 - 基于 class 的视图
将重复的异常处理保持在公共 class.I 中您可以将异常处理提取到基础 class 并在派生的 classes 中更改实现:
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
如果您使用的是 django class 基础视图,您可以重写 dispatch
并创建一个 mixin。在 django 中,基于 class 的视图调度方法接收请求并最终 returns 响应。
你可以这样做 -
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)
按您的方式修改。参考访问 documentation.