Python 忽略异常并返回原位置
我知道下面的代码可以用来忽略某个特定的错误,但我想知道怎么让代码在出错的地方继续执行。比如,如果在 do_something1 这个函数里出现了 'Exception' 这个错误,我该怎么做才能让代码忽略这个错误,继续完成 do_something1,然后再处理 do_something2?我的代码在处理完 except 块后就直接跳到 finally 块了。请给点建议,谢谢。
try:
do_something1
do_something2
do_something3
do_something4
except Exception:
pass
finally:
clean_up
编辑:谢谢你的回复。现在我知道正确的做法了。但我还有一个问题,我能否只忽略一个特定的错误(比如我知道错误的编号)。下面的代码可以这样写吗?
try:
do_something1
except Exception.strerror == 10001:
pass
try:
do_something2
except Exception.strerror == 10002:
pass
finally:
clean_up
do_something3
do_something4
7 个回答
这基本上是忽视了异常的关键点。
如果第一条语句抛出了异常,系统就处于一种不确定的状态,你需要把后面的语句当作不安全的来执行。
如果你知道哪些语句可能会失败,以及它们可能会怎么失败,那么你可以使用异常处理来专门解决某一组语句可能出现的问题,然后再继续执行下一部分。
所以,真正的解决办法就是在你想要当作一个整体的每一组语句周围处理异常。
代码不能直接回到try-except这个块里面。不过,如果你想要执行一些独立的操作,并且在其中一个操作失败时继续执行其他操作(而不想复制粘贴try/except块),你需要写成像下面这样:
actions = (
do_something1, do_something2, #...
)
for action in actions:
try:
action()
except Exception, error:
pass
更新一下。要忽略特定的错误,你需要捕捉你想要的错误类型,检查一下是否想要忽略它,如果不想,就重新抛出这个错误。
try:
do_something1
except TheExceptionTypeThatICanHandleError, e:
if e.strerror != 10001:
raise
finally:
clean_up
另外要注意,每个 try
语句如果想要有 finally
这个部分,就得自己写一个。它不会自动和之前的 try
连接在一起。单独写一个 raise
语句是重新抛出最后一个错误的正确方法。不要让别人告诉你其他的。
你想要的是继续执行的功能,但Python本身并不支持。除此之外,你的问题答案还得看你具体想做什么。如果你希望 do_something1
不管有没有错误都继续执行,那它就得自己捕捉错误并忽略它们。
如果你只是想让 do_something2
不管 do_something1
是否完成都执行,那你需要为每个操作写一个单独的 try
语句。
try:
do_something1()
except:
pass
try:
do_something2()
except:
pass
等等。如果你能提供一个更详细的例子,说明你想做什么,那么我或者其他更聪明的人很可能能帮到你,或者(更有可能的是)劝你放弃这个想法,建议一个更合理的替代方案。