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

时间:2010-11-11 05:18:59

标签: exception-handling python

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

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

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

7 个答案:

答案 0 :(得分:3)

您可以使用嵌套try.执行此操作。外部except的{​​{1}}块应捕获所有异常。它的身体是另一个try,它会立即重新引发异常。内部try的{​​{1}}块实际上处理了各个异常。您可以使用内部except中的try块来执行您想要的操作:在任何异常之后运行,但仅在异常之后运行。

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

finally

答案 1 :(得分:2)

我只是尝试了一些不同的想法,看起来像是一面旗帜是你最好的选择。

    只有在没有异常的情况下才会调用
  • else套件
  • 最后将永远被称为

答案 2 :(得分:1)

来自文档:http://docs.python.org/reference/compound_stmts.html#finally

如果 finally 存在,则指定'清理'处理程序。执行try子句,包括任何except和else子句。如果任何子句中发生异常但未处理,则会临时保存该异常。 finally子句被执行。如果存在已保存的异常,则会在finally子句的末尾重新引发异常。如果finally子句引发另一个异常或执行return或break语句,则保存的异常将丢失。在执行finally子句期间,程序无法使用异常信息。

答案 3 :(得分:1)

其实我不喜欢旗帜并认为它们是最后的解决方案。在这种情况下,我会考虑这样的事情:

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()

当然,如果您可以在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()

答案 4 :(得分:0)

目前尚不清楚是否需要处理不同的error1,error2等。如果没有,那么下面的代码就可以解决这个问题:

try:
    do_something()
except (error1, error2, error3), exception_variable:
    handle_any_of_these_exceptions()

如果您确实需要以不同的方式处理不同的错误以及使用公共代码,那么在except块中,您可以使用以下类型的代码:

    if isinstance(exception_variable, error1):
       do_things_specific_to_error1()

答案 5 :(得分:0)

这是我能想到的最佳方式。看起来像代码味道

try:
  exception_flag = True
  do-something()
  exception_flag = False
except error1:
  ...
except error2:
  ...
except:
  ...
finally:
  if exception_flag:
    ...

如果您没有在处理程序

中重新引用异常,则不需要finally

答案 6 :(得分:0)

我认为通过在try子句中使用return,这是一个更简洁的解决方案。 如果一切正常,我们将返回在bar()中获得的值。如果得到异常,我们将运行下一个代码,在这种情况下,将引发另一个异常。 以randint演示。

import random

def foo():
    try:
        return bar()
    except IndexError:
        print('Error.')
    raise KeyError('Error msg')
    
def bar():
    res = random.randint(0, 2)
    if res == 0:
        raise IndexError
    return res

res = foo()
print(res)