【发布时间】:2011-04-09 04:07:38
【问题描述】:
这就是我想要做的,我不确定要寻找什么或设计它的正确方法是什么:
我正在研究应用程序的异常层次结构。作为其中的一部分,有一些异常有时是致命的,有时是可恢复的——特定实例是致命的还是可恢复的,是在运行时在异常本身中确定的。出于组织的目的,我希望能够做类似的事情(我在 python 中工作):
try:
mightThrowAnException()
except RecoverableException:
handleThisException()
然后我会有类似的东西:
class MyException(...):
...
根据构造函数中发生的情况,MyException 可以将 FatalException 或 RecoverableException 作为基类。
我知道我可以有两个单独的异常 MyFatalException 和 MyRecoverableException 然后在代码中引发一个或另一个,但是对于不同类型的错误将会有很多不同的异常,这些异常可以从代码中有多个地方,异常必须做一些事情,比如检查错误日志以确定这个实例是否应该是致命的,所以我认为将所有这些代码放入异常处理程序本身是有意义的。
有几个问题:
- 考虑到我想做的事情,这是一个很好的方法吗,还是有更好的设计来做这种事情?
- 我读过关于类工厂的文章,但我没有看到用这种方法动态更改基类的简单方法,我考虑过的其他事情是元类或覆盖 excpetion 的
__new__()方法和我我不太确定这三种方法各自的优缺点是什么。这些是正确的方法还是我需要其他方法?
【问题讨论】:
-
嗯。您比我更了解您的特定需求,但是对于捕获异常的代码来确定它是否是致命的不是更有意义吗?除了日志记录之外,您还如何处理致命异常?不过,一般问题仍然很有趣
-
我怀疑我处理过的事情类似于几年前 Jesse 在 Java 项目中所描述的;它是我们应用程序的电子邮件网关。事后添加了许多错误处理和恢复。由于存在多种可能的(通常是通用的)异常类型,我们最终将它们归类为 RetryableException 和 FastFailException ,并且只会包装其中发生的任何错误,而不是声明该异常被抛出。结果没问题; Java 的检查异常让它有点复杂。
标签: python oop design-patterns exception metaprogramming