2009-10-23 58 views

回答

58

不,在finally时间sys.exc_info是全没有,是否有异常 与否。用途:

try: 
    whatever 
except: 
    here sys.exc_info is valid 
    to re-raise the exception, use a bare `raise` 
else: 
    here you know there was no exception 
finally: 
    and here you can do exception-independent finalization 
+0

感谢。 sys.exc_info(在except子句中)是我需要的 – Goutham 2009-10-23 06:08:23

+0

从Python 3。?开始,您可以从'finally:'块中访问'sys.exc_info'。 – Kentzo 2017-02-01 21:07:36

+0

@Kentzo我刚刚在python 3.6中试过。当你引发异常时,'sys.exc_info()'在finally块中返回'(None,None,None)'。 – Jonathan 2017-05-31 17:36:00

10

finally块将被无论一个异常是否抛出,或不执行,从而乔希指出的,你很可能不希望在那里处理它。

如果您确实需要引发异常的值,那么您应该在except块中捕获异常,并对其进行适当处理或重新提升,然后在finally块中使用该值 - - 如果在执行过程中没有发生异常情况,我们期望它可能从未设置过。

import sys 

exception_name = exception_value = None 

try: 
    # do stuff 
except Exception, e: 
    exception_name, exception_value = sys.exc_info()[:2] 
    raise # or don't -- it's up to you 
finally: 
    # do something with exception_name and exception_value 
    # but remember that they might still be none 
3

其实,其他答案有点模糊。所以,让我澄清一下。你总是可以从finally块中调用sys.exc_info()。但是,它的输出会根据异常是否实际发生而变化。

import sys 

def f(i): 

    try: 
     if i == 1: 
      raise Exception 
    except Exception as e: 
     print "except -> " + str(sys.exc_info()) 
    finally: 
     print "finally -> " + str(sys.exc_info()) 

f(0) 
f(1) 

>>> 
finally -> (None, None, None) 
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x029438F0>) 
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x029438F0>) 

因此,如果是第一级函数,则可以在finally块中始终知道是否引发异常。但是当调用堆栈的长度超过1时,sys.exc_info()的行为会有所不同,如下例所示。欲了解更多信息,请参考How sys.exc_info() works?

import sys 

def f(i): 

    try: 
     if i == 1: 
      raise Exception 
    except Exception as e: 
     print "except -> " + str(sys.exc_info()) 
    finally: 
     print "finally -> " + str(sys.exc_info()) 

def f1(i): 
    if i == 0: 
     try: 
      raise Exception('abc') 
     except Exception as e: 
      pass 

    f(i) 

f1(0) 
f1(1) 

>>> 
finally -> (<type 'exceptions.Exception'>, Exception('abc',), <traceback object at 0x02A33940>) 
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>) 
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>) 

我希望,它使事情更清晰。

+1

这仅适用于python2。 – coldfix 2017-07-13 13:53:45

+0

@coldfix你是否认为这只适用于python3? – 2018-01-08 07:27:33

+1

不,我在python2和python3上执行脚本。在python3上(修正了一些小的语法问题之后),'f(1)'的输出是'finally - >(None,None,None)',所以你不能在finally块中轻松获得异常。 – coldfix 2018-01-08 10:12:18

0

tryexcept块就定义可能是个例外空白变量:

import sys 

exception = None 

try: 
    result = 1/0 
except ZeroDivisionError as e: 
    exception = sys.exc_info() # or "e" 
finally: 
    if exception: 
     print(exception) 
    else: 
     print('Everything is fine') 

测试上的Python 3.6

相关问题