Python忽略异常并回到我所在的位置

时间:2010-09-28 23:26:01

标签: 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

修改 谢谢回复。现在我知道这样做的正确方法是什么。但这是另一个问题,我可以忽略一个特定的异常(比如说我知道错误号)。是否可以使用以下代码?

try:
    do_something1
except Exception.strerror == 10001:
    pass

try:
    do_something2
except Exception.strerror == 10002:
    pass
finally:
    clean_up

do_something3
do_something4

7 个答案:

答案 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,并像这样迭代它们,所以它不是那么罗嗦。如果需要工作函数的参数

,则可以使用lambda函数
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