Some_function()在执行时引发异常,因此程序跳转到异常:
try:
some_function()
except:
print("exception happened!")
如何查看导致异常发生的原因?
Some_function()在执行时引发异常,因此程序跳转到异常:
try:
some_function()
except:
print("exception happened!")
如何查看导致异常发生的原因?
当前回答
你可以像Lauritz推荐的那样开始:
except Exception as ex:
然后像这样打印ex:
try:
#your try code here
except Exception as ex:
print ex
其他回答
获取异常对象所属类的名称:
e.__class__.__name__
使用print_exc()函数也将打印堆栈跟踪,这是任何错误消息的基本信息。
是这样的:
from traceback import print_exc
class CustomException(Exception): pass
try:
raise CustomException("hi")
except Exception as e:
print ('type is:', e.__class__.__name__)
print_exc()
# print("exception happened!")
你会得到这样的输出:
type is: CustomException
Traceback (most recent call last):
File "exc.py", line 7, in <module>
raise CustomException("hi")
CustomException: hi
在打印和分析之后,代码可以决定不处理异常,只执行raise:
from traceback import print_exc
class CustomException(Exception): pass
def calculate():
raise CustomException("hi")
try:
calculate()
except CustomException as e:
# here do some extra steps in case of CustomException
print('custom logic doing cleanup and more')
# then re raise same exception
raise
输出:
custom logic doing cleanup and more
和解释器打印异常:
Traceback (most recent call last):
File "test.py", line 9, in <module>
calculate()
File "test.py", line 6, in calculate
raise CustomException("hi")
__main__.CustomException: hi
引发后,原始异常继续向上传播调用堆栈。(注意可能的陷阱)如果你引发新的异常,它会携带新的(更短的)堆栈跟踪。
from traceback import print_exc
class CustomException(Exception):
def __init__(self, ok):
self.ok = ok
def calculate():
raise CustomException(False)
try:
calculate()
except CustomException as e:
if not e.ok:
# Always use `raise` to rethrow exception
# following is usually mistake, but here we want to stress this point
raise CustomException(e.ok)
print("handling exception")
输出:
Traceback (most recent call last):
File "test.py", line 13, in <module>
raise CustomException(e.message)
__main__.CustomException: hi
注意traceback如何不包括第9行中的compute()函数,这是原始异常e的起源。
实际的异常可以通过以下方式捕获:
try:
i = 1/0
except Exception as e:
print e
您可以从Python教程中了解有关异常的更多信息。
你的问题是:“我如何才能确切地看到someFunction()中发生了什么导致异常发生?”
在我看来,您不是在问如何处理生产代码中不可预见的异常(正如许多答案所假设的那样),而是在问如何找出在开发过程中导致特定异常的原因。
最简单的方法是使用调试器,该调试器可以在未捕获异常发生的地方停止,最好不要退出,以便您可以检查变量。例如,Eclipse开源IDE中的PyDev可以做到这一点。要在Eclipse中启用该功能,请打开Debug透视图,在Run菜单中选择管理Python异常断点,并在未捕获的异常上检查挂起。
大多数答案指向except(…)as(…):语法(正确),但同时没有人想谈论房间里的大象,而大象是sys.exc_info()函数。 来自sys模块的文档(重点是我的):
This function returns a tuple of three values that give information about the exception that is currently being handled. (…) If no exception is being handled anywhere on the stack, a tuple containing three None values is returned. Otherwise, the values returned are (type, value, traceback). Their meaning is: type gets the type of the exception being handled (a subclass of BaseException); value gets the exception instance (an instance of the exception type); traceback gets a traceback object (see the Reference Manual) which encapsulates the call stack at the point where the exception originally occurred.
我认为sys.exc_info()可以被视为对原始问题“我如何知道发生了什么类型的异常?”的最直接答案。
使用类型class和as语句
try:#code
except Exception as e:
m=type(e)
#m is the class of the exception
strm=str(m)
#strm is the string of m