我知道使用下面的代码来忽略某个异常,但是如何让代码回到异常并继续执行的地方?如果在do_something1中引发异常'异常',如何使代码忽略它并继续完成do_something1并处理do_something2?我的代码只是在进程传递之后进入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
答案 0 :(得分:10)
这几乎忽略了例外。
如果第一个语句抛出异常,系统处于不确定状态,您必须将以下语句视为不安全才能运行。
如果您知道哪些语句可能失败,以及它们可能如何失败,那么您可以使用异常处理来专门清除特定语句块可能出现的问题,然后再转到下一部分。
因此,唯一真正的答案是处理您希望视为原子的每组语句的异常
答案 1 :(得分:9)
更新。忽略特定异常的方法是捕获所需的异常类型,测试它以查看是否要忽略它并重新引发它,如果你不这样做。
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
语句。
{{1}}
等。如果你能提供一个更详细的例子来说明你想做什么,那么我或者比我更聪明的人很可能会帮助你或者(更有可能)说服你,并建议更合理替代品。
答案 2 :(得分:7)
代码无法直接返回try-except块。但是,如果您正在尝试执行这些不同的独立操作并在一个失败时继续执行(没有复制/粘贴try / except块),那么您将不得不编写如下内容:
actions = (
do_something1, do_something2, #...
)
for action in actions:
try:
action()
except Exception, error:
pass
答案 3 :(得分:2)
当由于某些原因无法以代码所预期的方式完成执行任务时,通常会引发异常。这通常是作为例外引起的。应该处理例外而不是忽略。整个异常的想法是程序无法在正常执行流程中继续而没有异常结果。
如果您编写代码来打开文件并阅读它,该怎么办?如果此文件不存在该怎么办?
提出异常要好得多。您无法读取不存在的文件。你可以做的是处理异常,让用户知道不存在这样的文件。当文件根本无法打开时,继续读取文件会有什么好处。
事实上,Aaron提供的上述答案是基于处理例外的原则。
答案 4 :(得分:2)
你可以在列表中包含所有do_something
,并像这样迭代它们,所以它不是那么罗嗦。如果需要工作函数的参数
work = [lambda: dosomething1(args), dosomething2, lambda: dosomething3(*kw, **kwargs)]
for each in work:
try:
each()
except:
pass
cleanup()
答案 5 :(得分:1)
我最近发布了这个作为另一个问题的答案。这里有一个函数返回一个函数,它在调用任何函数时忽略(“陷阱”)指定的异常。然后通过“陷阱”间接调用所需的函数。
def maketrap(*exceptions):
def trap(func, *args, **kwargs):
try:
return func(*args, **kwargs)
except exceptions:
return None
return trap
# create a trap that ignores all exceptions
trapall = maketrap(Exception)
# create a trap that ignores two exceptions
trapkeyattrerr = maketrap(KeyError, AttributeError)
# Now call some functions, ignoring specific exceptions
trapall(dosomething1, arg1, arg2)
trapkeyattrerr(dosomething2, arg1, arg2, arg3)
总的来说,我和那些说忽略异常的人是个坏主意,但如果你这样做,你应该尽可能具体地说明你认为你的代码可以容忍的异常。
答案 6 :(得分:0)
Python 3.4添加了contextlib.suppress(),这是一个上下文管理器,它获取异常列表并在上下文中禁止它们:
with contextlib.suppress(IOError):
print('inside')
print(pathlib.Path('myfile').read_text()) # Boom
print('inside end')
print('outside')
请注意,就像常规try/except
一样,上下文中的异常会导致其余上下文被跳过。因此,如果在用Boom
注释的行中发生异常,则输出为:
inside
outside