2010-09-30 22 views
2

我有一个类,它的方法都需要一定的阶级场正确的存在。该类字段在构造函数中设置,它从配置文件读取,它可能会或可能不会从该配置文件中获取正确的数据。如果数据不正确,它将在类字段中包含错误的数据,并且类方法将抛出异常。使用一个try/catch重试相同的方法

如果出现这种情况,我想要做的就是再次运行方法,但用不同的调用类的构造函数。这是一个合理的处理方式:catch?因为即使使用正确的类字段,该方法也可能会抛出相同的异常。所以我想要的是第一次调用该方法时,会捕获该异常,然后该方法再次运行。但在第二次运行时,如果引发异常,我希望它传播。所以:


try: 
    MyClass().method() 
except MyException: 
    MyClass(True).method() 

有没有明显的缺陷呢?或者更好的方法来做到这一点,而不使用计数器,标志或其他丑陋的辅助对象?

+0

从你所描述的东西,看起来正确的。 – 2010-09-30 18:00:43

+2

为什么不直接写一个修正无效数据的正确的“构造函数”(实际上是一个初始化方法)?这就像“为什么在手刹时修理刹车?” – 2010-09-30 18:20:26

+0

因为数据实际上是一个硬件地址,并测试它是尝试与设备对话,并等待它出现故障,它可以(有效),需要长达4秒,即使它没有失败的唯一途径。仅仅以正确的格式,而不是正确的地址检查地址是否是可行的(或有效的)是不可能的(或有效的)。简单地等待某个方法在与之通话时失败,然后重新获取该地址,效率会更高。 – Falmarri 2010-09-30 18:31:16

回答

3

我有点惊讶,你不希望MyClass实例坚持以后使用,但是,鉴于这是你的意图,你的代码是正确和简洁的 - 它做你声明你想要的没有任何“明显的缺陷”。我不知道你觉得难看,你认为哪些漂亮,但没有引入一些“辅助对象”我甚至不能想到另一种方式来实现你们所要求的对象 - !)

+0

这只是一个更大的程序的一部分,这些程序太长而无法发布。还有很多非__python__的东西,如果要再次写入,可能会更好,但是让我们假设有很多只包含静态方法的类 – Falmarri 2010-09-30 18:14:48

+0

@Falmarri,如果方法是静态的,您不需要需要实例化类来调用它 - 这就是让方法毕竟是_static_(任何Python,C++,Java,...)的关键。 – 2010-09-30 22:15:05

+0

是的,那只是我们的非pythonic东西的一个例子-P – Falmarri 2010-10-01 08:33:38

1

你在做什么是好的;如果该方法从异常处理程序中抛出相同的异常,它将被传播并且不被相同的处理程序捕获。

0

听起来像是你”重新谈论Factory method。我会创建一个单独的Creator类来处理这种情况。

相关问题