2010-11-11 87 views
6

一个Python新手的问题,如何来执行的东西:我需要做下面的如果任何异常情况发生

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

我可以设置一个标志,并做到这一点。但是,有没有更干净的方式来做到这一点?

+0

设置标志有什么不干净?我的意思是,“if”陈述通常被认为是无害的... – detly 2010-11-11 06:11:24

+1

+1。否则你会把事情与一个额外的嵌套层次混淆。也许有更好的方法来构建代码流程,所以你根本不需要这么做 – 2010-11-11 06:15:55

+0

@detly关于一面旗子是什么不干净?错误处理很容易。如果您可以使用结构化替换标志解决方案,这通常是一种改进。所以,是的,如果没有其他简短的方法,那么一面旗子可能是做这件事的正确方法之一,但这是最后的手段。 – Alfe 2017-06-07 09:22:23

回答

2

我刚刚尝试了一些不同的想法,它看起来像一个国旗是你最好的选择。如果没有异常

  • 其他套件只叫
  • 最后总是会被称为
+2

可能在else子句中设置得最好。 – aaronasterling 2010-11-11 05:54:04

1

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

如果最后存在时,它指定了一个“清除”的处理程序。 try子句被执行,包括任何except和else子句。如果任何一个条款发生异常并且没有被处理,则异常被临时保存。 finally子句被执行。如果有一个保存的异常,它会在finally子句结尾处重新提出。如果finally子句引发另一个异常或执行返回或中断语句,则保存的异常将丢失。在执行finally子句期间,程序不能使用异常信息。

+6

即使存在** no **异常,也会执行'finally'子句的主体。我不认为这是OP想要的。 – detly 2010-11-11 05:25:09

+0

是的。终于会永远执行。我想要与其他方面相反的东西。 – amit 2010-11-11 05:48:48

0

目前尚不清楚,如果你需要不同的处理ERROR1,误差2等。如果没有,那么以下代码将这样的伎俩:

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

如果你确实需要以不同的方式处理不同的错误,以及具有公共代码,然后在except块,你可以有FOL的代码降低型:

if isinstance(exception_variable, error1): 
     do_things_specific_to_error1() 
+0

我需要做不同的事情。使用isinstance看起来像unpythonic,但绝对是一种选择。 – amit 2010-11-11 05:59:08

+0

@amit我普遍认为'isinstance'是一件坏事,但'except'只是基于它们的类型开始时才隐含地使用它。我认为这是适当的。 – aaronasterling 2010-11-11 06:07:47

0

这是我能想到的最好的方式。看起来像一个代码味道虽然

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

你不会需要finally如果你不是在处理reraising例外

2

可以与外try的嵌套try.except块做到这一点应该抓住所有例外。它的身体是另一个try,立即重新引发异常。内部tryexcept块实际上处理个别异常。您可以使用内部try中的finally块来做你想做的事情:在发生任何异常之后运行某些东西,但只能在发生异常之后运行。

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

try: 
    input("]") # for Python 3: eval(input("]")) 
except: 
    try: 
     raise 
    except SyntaxError: 
     print "?SYNTAX", 
    except ValueError: 
     print "?ILLEGAL QUANTITY", 
    # additional handlers here 
    except: 
     print "?UNKNOWN", 
    finally: 
     print "ERROR" 
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() 
相关问题