如何使这种例外处理变得更简单?

时间:2016-12-01 18:02:17

标签: python python-3.x try-except

我有相当于以下代码:

class SomeError(Exception): pass

def do_things_with(fileobject):
    # Do things, and at some point the line below MAY be called
    raise SomeError

def try_another_approach():
    # Do different things, but at some point the line below MAY be called
    raise SomeError

try:
    try:
        with open('somefile') as somefile:
            do_things_with(somefile)
    except FileNotFoundError:
        try_another_approach()
except SomeError:
    print('Ooops') 

也就是说,我尝试打开一个文件(或任何其他可能引起某些其他异常的事情),如果失败,可能会使用不同的方法,但两种方法可能会引发同一组异常。

现在我必须使用嵌套的try / except来处理这个问题,如图所示,但我很想做这样的事情:

try:
    with open('somefile') as somefile:
        do_things_with(somefile)
except FileNotFoundError:
    # I'd like to have any SomeError raised from the function below
    # at the except clause just below, to keep code compact as I may
    # be adding more exceptions in the future
    try_another_approach()
except SomeError:
    print('Ooops')

当然这不起作用(我得到其中一个During handling of the above exception, another exception occurred),但它说明了我想要实现的目标:处理在try块和一些除了块之外引发的异常以后除了阻止,没有嵌套

我不需要来避免嵌套,我只是好奇解决这个问题而不必嵌套,以防万一。

在Python中它是否完全可能?

提前致谢:)

1 个答案:

答案 0 :(得分:2)

不,你不能。在except子句中引发的异常将在outter块中查找处理程序(即您执行的嵌套)。如果你当前的方法没有嵌套,那就没有办法解决这个问题了。

删除嵌套的唯一方法是减少异常;也就是说,而不是raise Errorreturn一个值,表明出现了问题。在这种情况下,您将对返回的值(使用if子句)执行操作,而不是对返回的异常执行操作(使用try-except子句)。