带有rais的截获异常

2024-04-20 01:41:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,它查找特殊的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。在

此函数从另一个函数调用:

^{pr2}$

所以-当文件找不到-csproj_tag_finder()返回None类型,然后打印WARNING。第二个函数-parser()查找空的mod_tag_from_csproj变量,并打印WARNING。这是无害的,所以我想让csproj_tag_finder()引发特殊的Exception,所以parser()除了它并通过==检查,而不是打印文本。在

我试着添加一些东西,比如:

    ...
    except IOError as e:
#        print 'WARNING: cant find file: %s' % e
        raise Exception('NoFile')

为了csproj_tag_finder()parser()中捕获它-但是它会立即中断下一步。在

p.S.稍后if not mod_tag_from_csproj:将调用另一个函数来添加新的Element。这个任务可以用return 'NoFile'来解决,然后用if/else来解决,但在我看来,raise在这里会更正确。还是没有?在


Tags: 文件函数inmodreturniffindertag
1条回答
网友
1楼 · 发布于 2024-04-20 01:41:57

raise立即中断下一步正是它应该做的。事实上,这就是例外的全部原因。在

但是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中,并在最后引发。在


作为一个补充说明,您可能希望创建一个NoFileException子类,然后使用Exception('NoFile')来测试异常字符串,而不需要测试它,只需使用except NoFileException:来处理它。这意味着您可以在异常中携带一些其他有用的信息(实际的异常、文件名等),而不会妨碍它。如果这听起来很可怕,那就不是了。简直就是一句话:

^{pr2}$

相关问题 更多 >