通过加注拦截异常

时间:2015-04-24 08:20:52

标签: python python-2.7 exception

我有函数,如果是项目文件,它会查找特殊的container-element

Element

如果找不到文件 - 它会打印def csproj_tag_finder(mod_proj_file): """Looking for 'BuildType' element in each module's csproj file passed in `mod_proj_file` ard return it's value (CLOUD, MAIN, NGUI, NONE)""" try: tree = ET.ElementTree(file=mod_proj_file) root = tree.getroot() for element in root.iterfind('.//'): if ('BuildType') in element.tag: return element.text except IOError as e: # print 'WARNING: cant find file: %s' % e

这个函数来自另一个:

'WARNING: cant find file: %s' % e

所以 - 当找不到文件时 - def parser(modename, mod_proj_file): ... # module's tag's from project file in <BuildType> elements, looks like CLOUD mod_tag_from_csproj = csproj_tag_finder(mod_proj_file) if not mod_tag_from_csproj: print('WARNING: module %s have not <BuildType> elements in file %s!' % (modename, mod_proj_file)) ... 返回csproj_tag_finder()类型,然后打印None。第二个功能 - WARNING找到空的parser()变量,并打印mod_tag_from_csproj。这是无害的,所以我希望make WARNING引发特殊csproj_tag_finder(),所以除了它Exception并通过parser()检查,而不是打印文本。

我尝试添加类似的内容:

==

... except IOError as e: # print 'WARNING: cant find file: %s' % e raise Exception('NoFile') 稍后在csproj_tag_finder()中抓住它 - 但它会立即中断后续步骤。

P.S。稍后parser()将调用另一个函数来添加新的if not mod_tag_from_csproj:。只需Element即可解决此任务,然后使用return 'NoFile'进行搜索 - 但在我看来if/else将更加正确。或者不是?

1 个答案:

答案 0 :(得分:1)

raise立即中断后续步骤正是它应该做的事情。事实上,这就是例外的全部要点。

但是return 会立即中断后续步骤,因为提前返回也是return的全部内容。

如果要将错误保存到以后,继续做其他工作,然后在最后提高它,则必须明确地执行此操作。例如:

def spam():
    error = None
    try:
        do_some_stuff()
    except IOError as e:
        print 'WARNING: cant find file %s' % e
        error = Exception('NoFile')
    try:
        do_some_more_stuff()
    except OtherError as e:
        print 'WARNING: cant frob the glotz %s' % e
        error = Exception('NoGlotz')
    # etc.
    if error:
        raise error

现在,只要没有意外的异常,你忘记处理,最后失败的任何事情将在error,并且最终会被提出。

作为旁注,不要提出Exception('NoFile'),而是稍后使用==来测试异常字符串,您可能想要创建一个NoFileException子类;然后你不需要测试它,你可以用except NoFileException:来处理它。这意味着您可以在异常中携带一些其他有用的信息(实际异常,文件名等),而不会妨碍它。如果这听起来很可怕,那就不是了。它实际上是一个单行:

class NoFileException(Exception): pass