繁体   English   中英

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

[英]How in Python find where exception was raised

如何确定引发了什么函数异常。 例如,存在两个函数:'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 inspect

try:
    foo()
except Exception as e:
    print "Exception raised in %s" % inspect.trace()[-1][3]

我使用traceback模块,如下所示:

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

如果代码从文件运行,则回溯将告诉错误发生的位置的行和字符数:)

编辑:

为了适应Habibutsu的评论: Yes, it's useful for printing, but when needed to get more info (for example function name) - not suitable

doc-pages告诉你如何以编程方式提取跟踪: http//docs.python.org/2/library/traceback.html

从上面链接的页面:

>>> 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']

该DOC-字符串traceback.extract_stack是相同traceback.extract_tb

traceback.extract_tb(traceback [,limit])

返回最多限制从回溯对象回溯中提取的“预处理”堆栈跟踪条目的列表。 它对堆栈跟踪的替代格式化很有用。 如果省略limit或None,则提取所有条目。 “预处理”堆栈跟踪条目是四倍(文件名,行号,函数名称,文本),表示通常为堆栈跟踪打印的信息。 文本是一个带有前导和尾随空格的字符串; 如果源不可用则为None。

你的目标是什么? 如果你担心barfoo抛出相同的异常类型并且调用者无法区分它们,那么只需派生一个新的异常类:

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)..."

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM