我实现了一个python类,实例存储在h5文件中。因此,此类的__init__()
- 函数首先检查此h5文件是否仍存在于先前的模拟中,如果是这样,则会引发raw_input,要求覆盖此文件(此后文件将被新实例覆盖)或不,之后会出现错误。
我正在寻找一种方法,当这个文件(以及实例)已经存在并且在__init__()
- 方法中注明时,我不会在脚本停止之后引发错误,但是“取消”已启动的实例化并且脚本继续...是否有一种干净的方式来实现这样的“取消和ocntinue”?
答案 0 :(得分:0)
正确的方法是来引发异常。默认情况下,异常将从__init__
传播到任何调用它的人,最终一直到顶部,停止脚本。
但是,如果您要处理该异常并继续,请使用try
/ catch
阻止您要继续的任何级别,如Handling Exceptions中所述。
例如:
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
工厂函数或{ {1}}循环,在这种情况下你甚至不需要异常;只是不要初始化。但是没有什么能阻止你在for
内提出异常。