Sta*_*tan 13 python exception-handling
我知道使用下面的代码来忽略某个异常,但是如何让代码回到它得到异常并继续执行的地方?如果在do_something1中引发异常'异常',如何使代码忽略它并继续完成do_something1并处理do_something2?我的代码只是在进程传递之后进入finally块,除了块.请指教,谢谢.
try:
do_something1
do_something2
do_something3
do_something4
except Exception:
pass
finally:
clean_up
Run Code Online (Sandbox Code Playgroud)
编辑: 谢谢你的回复.现在我知道这样做的正确方法是什么.但这是另一个问题,我可以忽略一个特定的异常(比如说我知道错误号).下面的代码可能吗?
try:
do_something1
except Exception.strerror == 10001:
pass
try:
do_something2
except Exception.strerror == 10002:
pass
finally:
clean_up
do_something3
do_something4
Run Code Online (Sandbox Code Playgroud)
更新.忽略特定异常的方法是捕获所需的异常类型,测试它以查看是否要忽略它并重新引发它,如果你不这样做.
try:
do_something1
except TheExceptionTypeThatICanHandleError, e:
if e.strerror != 10001:
raise
finally:
clean_up
Run Code Online (Sandbox Code Playgroud)
另请注意,如果您希望每个try语句finally都有一个,那么每个语句都需要它自己的子句.它不会"附加"到先前的try声明.一个raise没有别的说法是重新募集的最后一个异常的正确方法.不要让任何人告诉你.
你想要的是python本身不提供的延续.除此之外,您的问题的答案取决于您想要做什么.如果你想do_something1继续而不管异常,那么它必须捕获异常并忽略它们本身.
如果您只是想要do_something2发生,无论是否do_something1完成,您都需要try为每个语句单独声明.
try:
do_something1()
except:
pass
try:
do_something2()
except:
pass
Run Code Online (Sandbox Code Playgroud)
等等.如果你能提供一个更详细的例子来说明你想要做什么,那么我或者比我更聪明的人很可能会帮助你,或者(更有可能)说服你,并建议一个更合理的选择.
代码没有直接返回try-except块的方法.但是,如果您正在尝试执行这些不同的独立操作并在一个失败时继续执行(没有复制/粘贴try/except块),那么您将不得不编写如下内容:
actions = (
do_something1, do_something2, #...
)
for action in actions:
try:
action()
except Exception, error:
pass
Run Code Online (Sandbox Code Playgroud)
这几乎是缺少例外的.
如果第一个语句抛出异常,则系统处于不确定状态,您必须将以下语句视为运行不安全.
如果您知道哪些语句可能失败,以及它们可能如何失败,那么您可以使用异常处理来专门清除特定语句块可能出现的问题,然后再转到下一部分.
因此,唯一真正的答案是处理您希望视为原子的每组语句的异常