我有相当于以下代码:
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中它是否完全可能?
提前致谢:)
答案 0 :(得分:2)
不,你不能。在except子句中引发的异常将在outter块中查找处理程序(即您执行的嵌套)。如果你当前的方法没有嵌套,那就没有办法解决这个问题了。
删除嵌套的唯一方法是减少异常;也就是说,而不是raise Error
你return
一个值,表明出现了问题。在这种情况下,您将对返回的值(使用if
子句)执行操作,而不是对返回的异常执行操作(使用try-except
子句)。