0

我实现了一个 python 类,其实例存储在一个 h5 文件中。因此,__init__()这个类的 -function 首先检查这个 h5 文件是否存在于以前的模拟中,如果存在,则引发一个 raw_input 要求覆盖这个文件(然后文件被新实例覆盖),然后一个引发错误。

我正在寻找一种方法,当这个文件(以及实例)已经存在并且在__init__()-method 中注明时,我不会在脚本停止后引发错误,而是“取消”启动的实例化和脚本只是继续......有没有一种干净的方法来实现这种“取消和ocntinue”?

4

1 回答 1

0

正确的做法引发异常。默认情况下,异常将从 传播__init__到调用它的任何人,并最终一直传播到顶部,停止脚本。

但是,如果您想处理该异常并继续,请在您想继续的任何级别使用try/catch块,如处理异常中所述。

例如:

class ThingyAlreadyExistsError(RuntimeError):
    pass

class Thingy(object):
    def __init__(self, pathname):
        if os.path.exists(pathname):
            yn = raw_input('{} already exists. Overwrite (y/N)?'.format(pathname))
            if yn.lower != 'y':
                raise ThingyAlreadyExistsError(pathname)
        # finish initialization

thingies = []
for pathname in pathnames:
    try:
        thingy = Thingy(pathname)
    except ThingyAlreadyExistsError:
        continue
    thingies.append(thingy)

如果您想在到达之前捕获它__init__,您可以随时在__new__方法、@classmethod工厂函数或for循环中进行检查,在这种情况下,您甚至不需要异常;只是不要初始化。但是没有什么能阻止你在里面提出异常__init__

于 2013-01-28T10:06:03.843 回答