我的脚本中有try
/finally
子句。是否可以从finally
子句中得到确切的错误信息?我可以从python的finally块中得到异常吗?
28
A
回答
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
2
你会想要在except子句中这样做,而不是finally中。
参考:http://www.doughellmann.com/articles/Python-Exception-Handling/
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>)
我希望,它使事情更清晰。
0
前try
except
块就定义可能是个例外空白变量:
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
相关问题
- 1. 在finally块中,我可以告诉抛出了什么异常吗?
- 2. 我可以得到导致异常的代码行吗?
- 3. 我可以在Finally块中拥有业务逻辑吗?
- 4. 来自finally块内的异常
- 5. 在finally子句中的Python异常吃掉了以前的异常
- 6. C#可以写入指令从finally块重新排序到try块吗?
- 7. 蟒蛇:从try块恢复异常,如果finally块产生异常
- 8. C# - 从finally子句中处理异常
- 9. 我们可以捕捉一个没有catch块的异常吗?
- 10. 我可以在Python中导致异常吗?
- 11. 如何记录Java中finally块的异常所掩盖的异常?
- 12. 如果我在属性的getter中抛出异常,我可以获得catch块中属性的名称吗?
- 13. 如果数据库没有找到,我可以得到PDO抛出异常吗?
- 14. 为什么我得到异常异常?
- 15. finally {}中的捕获异常?必须?
- 16. 我可以从python的某个数中得到一个分数吗?
- 17. 从try块跳跃finally块
- 18. 我在哪里可以找到Python内置引发的异常?
- 19. 我可以在PowerShell中获得详细的异常堆栈跟踪吗?
- 20. python:理解中的异常:我可以检索循环变量的值吗?
- 21. 我可以在android NDK中的C中捕获异常吗?
- 22. 我得到异常短信
- 23. 我得到NULL Refence异常
- 24. 我在哪里可以找到Python中可能的异常列表?
- 25. 习惯性的Java“finally”块只能运行在异常处
- 26. 奇怪的异常行为与try-finally块
- 27. 有人请告诉我为什么我们可以得到以下异常
- 28. 只有一个try-catch块可以捕获一些异常吗?
- 29. 我可以获得未处理(目标)C++异常的堆栈跟踪吗?
- 30. 当catch块和finally块在Java中抛出异常时会发生什么?
感谢。 sys.exc_info(在except子句中)是我需要的 – Goutham 2009-10-23 06:08:23
从Python 3。?开始,您可以从'finally:'块中访问'sys.exc_info'。 – Kentzo 2017-02-01 21:07:36
@Kentzo我刚刚在python 3.6中试过。当你引发异常时,'sys.exc_info()'在finally块中返回'(None,None,None)'。 – Jonathan 2017-05-31 17:36:00