在类实例化期间干净地处理问题

时间:2013-03-13 15:49:25

标签: python class error-handling python-2.7

我正在编写一个将导入的Python类&由多个调用应用程序使用。每个调用应用程序都将被编写,以便它在启动时实例化一次(并且只有一次),然后在应用程序关闭之前维护该实例。

成功的实例化涉及相当长的依赖关系列表&检查,例如给定文件夹中存在给定的MS Access文件,能够更新该DB,在另一个文件夹中读取/写入日志文件的权限,是否存在与调用应用程序相关的某些其他文件夹...明白了。我想要做的是在类实例化中检查所有这些依赖项。如果其中任何一个失败,则类中的代码将为用户提供错误弹出窗口,然后避免实例化该类。然后,调用应用程序将检测到该类未实例化,只需退出。

我已经完成了其他各种各样的线程,我发现的选项要么是创建一个工厂(这似乎有点夸大了所需要的东西),要么重写__new__方法(其他讨论可以很棘手...我发现的每一个代码样本都有很长的评论警告,警告所有情况都不行。)

因此,从首选实践的角度来看,这两种方式中的任何一种都是可行的吗?或者是否有其他替代方案最适合我想要完成的任务?

1 个答案:

答案 0 :(得分:2)

标准做法是引发异常,代码实例化你的类捕获并处理该异常:

class MyClass(object):
    def __init__(self, foo, bar, baz):
        if not self._database_exists(foo):
            raise ValueError('No valid database {}'.format(foo))

        # etc.

然后:

try:
    theinstance = MyClass('foooption', barvalue, bazvalue)
except ValueError as e:
    # Oops, something went wrong
    showErrorToUser(e)
    theinstance = None