如何在Python中查找引发异常的位置
如何确定在哪个函数中引发了异常。例如,存在两个函数:“foo”和“bar”。在'foo'中,将随机引发异常如何在Python中查找引发异常的位置,python,exception,Python,Exception,如何确定在哪个函数中引发了异常。例如,存在两个函数:“foo”和“bar”。在'foo'中,将随机引发异常 import random def foo(): if random.randint(1, 10) % 2: raise Exception bar() def bar(): raise Exception try: foo() except Exception as e: print "Exception raised i
import random
def foo():
if random.randint(1, 10) % 2:
raise Exception
bar()
def bar():
raise Exception
try:
foo()
except Exception as e:
print "Exception raised in %s" % ???
我使用回溯模块,如下所示:
import traceback
try:
1 / 0
except Exception:
print traceback.format_exc()
这将提供以下输出:
Traceback (most recent call last):
File "<ipython-input-3-6b05b5b621cb>", line 2, in <module>
1 / 0
ZeroDivisionError: integer division or modulo by zero
traceback.extract\u stack的文档字符串与traceback.extract\u tb的文档字符串相同
回溯。提取(回溯[,限制])
返回最多限“预处理”堆栈跟踪项的列表
从回溯对象中提取回溯。这对我很有用
堆栈跟踪的替代格式。如果省略限制或无限制,则所有
条目被提取出来。“预处理”堆栈跟踪条目是
四倍(文件名、行号、函数名、文本)表示
通常为堆栈跟踪打印的信息。正文是
去掉前导和尾随空格的字符串;如果来源
不可用,但不可用
你的目标是什么?如果您担心bar
和foo
引发相同的异常类型,而调用方无法区分它们,只需派生一个新的异常类:
import random
class FooException(Exception):
"""An exception thrown only by foo."""
def foo():
if random.randint(1,10) % 2:
raise FooException
bar()
def bar():
raise Exception
try:
foo()
except FooException:
print "Exception raised in foo..."
except:
print "Exception raised in bar (probably)..."
这可能是提问者的意思,但这可能不是最好的现实生活解决方案:)如果这是一个纯粹的“学术”问题,为什么不呢,但你不应该依赖于像在现实生活中检查堆栈跟踪这样的东西。。。相反,使用自定义异常类(或许多内置类中的一个)更好。是的,它只是有趣的是,它对于打印很有用,但当需要获取更多信息(例如函数名)时,则不是suitable@Habibutsu我更新了我的答案,向您展示了回溯
是多么的合适,并且可以用来提取函数名,例如:)我同意你的方法更好,但它不适用于你从用户那里收到的回调。或者,例如,在尝试调用函数或函数内部时可能引发TypeError的RPC。事实上,现在我没有构建依赖于此信息的逻辑,但这很有趣。您可以将每个回调封装在引发自定义异常的代码中。在这种情况下,如果不将原始异常包含在newWell中,您将丢失有关其的信息,如果您使用的是Python 3,则可以使用。在Python2中实现这一点的方法没有那么好。
>>> import traceback
>>> def another_function():
... lumberstack()
...
>>> def lumberstack():
... traceback.print_stack()
... print repr(traceback.extract_stack())
... print repr(traceback.format_stack())
...
>>> another_function()
File "<doctest>", line 10, in <module>
another_function()
File "<doctest>", line 3, in another_function
lumberstack()
File "<doctest>", line 6, in lumberstack
traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
('<doctest>', 3, 'another_function', 'lumberstack()'),
('<doctest>', 7, 'lumberstack', 'print repr(traceback.extract_stack())')]
[' File "<doctest>", line 10, in <module>\n another_function()\n',
' File "<doctest>", line 3, in another_function\n lumberstack()\n',
' File "<doctest>", line 8, in lumberstack\n print repr(traceback.format_stack())\n']
import random
class FooException(Exception):
"""An exception thrown only by foo."""
def foo():
if random.randint(1,10) % 2:
raise FooException
bar()
def bar():
raise Exception
try:
foo()
except FooException:
print "Exception raised in foo..."
except:
print "Exception raised in bar (probably)..."