首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用raise截取异常

用raise截取异常
EN

Stack Overflow用户
提问于 2015-04-24 08:20:52
回答 1查看 526关注 0票数 0

我有函数,它查找特殊的Element (如果是项目文件):

代码语言:javascript
复制
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

这个函数是从另一个函数调用的:

代码语言:javascript
复制
    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变量,并打印WARNING。这是无害的,所以我想让csproj_tag_finder()引发特殊的Exception,所以parser()除了它并通过==检查,而不是打印文本。

我试着添加了这样的内容:

代码语言:javascript
复制
    ...
    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在这里会更正确。还是不想?

EN

回答 1

Stack Overflow用户

发布于 2015-04-24 08:28:42

raise会立即中断接下来的步骤,这正是它应该做的。事实上,这就是例外的全部要点。

但是return也会立即中断接下来的步骤,因为早期返回也是return的全部要点。

如果希望将错误保存到以后,继续执行其他工作,然后在结束时引发错误,则必须显式地这样做。例如:

代码语言:javascript
复制
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')子类,而不是引发==,然后使用==测试异常字符串;然后不需要测试它,您只需使用except NoFileException:来处理它。这意味着您可以携带其他一些有用的信息(实际异常、文件名等)。在你的例外情况下,它也不会妨碍你。如果这听起来很吓人的话,那就不是了。这实际上是一条单线线:

代码语言:javascript
复制
class NoFileException(Exception): pass
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29842236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档