如果发生任何异常,如何执行某些操作

ami*_*mit 11 python exception-handling

一个python新手问题:我需要做以下事情

try:
  do-something()
except error1:
  ...
except error2:
  ...
except:
  ...
#Here I need to do something if any exception of the above exception was thrown.
Run Code Online (Sandbox Code Playgroud)

我可以设置一个标志并执行此操作.但是有更清洁的方法吗?

Alf*_*lfe 9

实际上我不喜欢标志并认为它们是最后的解决方案。在这种情况下我会考虑这样的事情:

def f():
  try:
    do_something()
  except E1:
    handle_E1()
  except E2:
    handle_E2()
  else:
    return
  do_stuff_to_be_done_in_case_any_exception_occurred()
Run Code Online (Sandbox Code Playgroud)

当然,这只是您可以带着else:箱子返回的情况下的一种选择。

另一种选择可能是重新抛出异常并重新捕获它以进行更一般的错误处理。这甚至可能是最干净的方法:

def f():
  try:  # general error handling
    try:  # specific error handling
      do_something()
    except E1:
      handle_E1()
      raise
    except E2:
      handle_E2()
      raise
  except (E1, E2):
    do_stuff_to_be_done_in_case_any_exception_occurred()
Run Code Online (Sandbox Code Playgroud)


kin*_*all 6

您可以使用嵌套来执行此操作。外部块try.应该捕获所有异常。它的主体是另一个立即重新引发异常的主体。内部的块实际上处理各个异常。您可以使用内部的块来执行您想要的操作:在任何异常之后运行某些内容,但仅在异常之后运行。excepttrytryexcepttryfinallytry

这是一个小的交互式示例(出于怀旧目的,以 Applesoft BASIC 为模型)。

try:
    input("]")  # for Python 3: eval(input("]"))
except:
    try:
       #Here do something if any exception was thrown.
       raise
    except SyntaxError:
       print "?SYNTAX",
    except ValueError:
       print "?ILLEGAL QUANTITY",
    # additional handlers here
    except:
       print "?UNKNOWN",
    finally:
       print "ERROR"
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 5

我刚刚尝试了几个不同的想法,看起来旗帜是你最好的选择。

  • else suite 只有在没有异常的情况下才会被调用
  • 最后总会被称为

  • 可能最好在 else 子句中设置。 (4认同)