python - 动态继承的设计模式

标签 python oop design-patterns exception metaprogramming

这是我正在尝试做的,我不确定要寻找什么或设计它的正确方法是什么:

我正在处理应用程序的异常层次结构。作为其中的一部分,有一些异常有时是致命的而其他时候是可恢复的——特定实例是致命的还是可恢复的是在异常本身的运行时确定的。为了组织的目的,我希望能够做类似的事情(我在 python 中工作):

try:
    mightThrowAnException()
except RecoverableException:
    handleThisException()

然后我会有类似的东西:

class MyException(...):
    ...

MyException 可以将 FatalException 或 RecoverableException 作为基类,具体取决于构造函数中发生的情况。

我知道我可以有两个单独的异常 MyFatalExceptionMyRecoverableException 然后在代码中引发一个或另一个但是会有很多不同的异常不同类型的错误,可能从代码中的多个位置引发,异常必须做一些事情,比如检查错误日志以确定这个实例是否应该是致命的,所以我认为把所有的将此代码放入异常处理程序本身。

所以有几个问题:

  1. 考虑到我想做的事情,这是实现它的好方法,还是针对这类事情有更好的设计?
  2. 我读过类工厂,但我没有看到用这种方法动态更改基类的简单方法,我考虑过的其他事情是元类或覆盖异常的 __new__() 方法,我不太确定这三种方法的优缺点是什么。这些方法是否正确,或者我还需要其他方法吗?

最佳答案

我的建议是将异常的内容与其含义分离。同一个异常在不同的地方可以有不同的含义!

您的问题建议将异常转化为具有高级功能(如检查日志)的“感知”对象。但这不是异常(exception)的意图。异常应该是轻量级数据对象,提供尽可能多的关于发生了什么的信息,而不是自行决定应该如何处理。捕获代码就是这样做的,正如我上面所说的,完全可以想象某些异常将在某个地方以一种方式处理,而在其他地方以另一种方式处理。

关于python - 动态继承的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5602804/

相关文章:

php - Moodle:在 $table = set_sql(); 中使用 mysql 连接;方法

javascript - 在事件处理程序 oop 中调用函数

没有接口(interface)的 C# 插件模式

java - 将工厂设计模式与具有额外构造函数参数的子类一起使用

design-patterns - 责任链与装饰器设计模式

python - elif 使用字典但不执行值

python - PYTHON 中的希腊语编码

python - 使用子进程的 pip freeze 调用 - 没有这样的文件或目录

python - 在 Tensorboard 中为两个不同的图表设置双轴

multithreading - 什么是常见的并发陷阱?