Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中查找引发异常的位置_Python_Exception - Fatal编程技术网

如何在Python中查找引发异常的位置

如何在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

如何确定在哪个函数中引发了异常。例如,存在两个函数:“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 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)..."