首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python如何用完整的堆栈信息冒泡异常

问Python如何用完整的堆栈信息冒泡异常
EN

Stack Overflow用户
提问于 2016-07-12 01:20:23
回答 1查看 1.4K关注 0票数 0

请参阅以下代码

代码语言:javascript
复制
def ex_string(ex):
    return "Error:{} Traceback:{}".format(ex, traceback.format_exc())

def map_values(listing):
    ...
    obj = listing['value']
    ...

def process_listing(listing):
    try:
        listing = map_values(listing)
    except Exception as ex:
        do_some_handling(listing)
        print ex_string(ex)  # this stack shows actual line inside map_values
        raise ex

def start():
    for listing in listings:
        try:
            process_listing(listing)
            save_listing(listing)
        except Exception as ex:
            error = ex_string(ex)  #this stack shows map_values function only
            log_error(error)

如前所述,当listing不包含'value'元素时,我不知道哪一行引起了问题,我从日志中知道的所有信息都在map_values函数中的某个地方,如何从首次引发异常的地方获得完整的堆栈跟踪?在本例中,obj = listing['value']

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-12 01:23:21

使用在raise子句中不带参数的except来重新处理您正在处理的异常及其原始跟踪:

代码语言:javascript
复制
def process_listing(listing):
    try:
        listing = map_values(listing)
    except Exception as ex:
        do_some_handling(listing)
        print ex_string(ex)
        raise  # no ex

没有参数的raise意味着您希望处理的异常被认为是未处理的,因此它会用相同的回溯恢复传播。

这里使用带有一个参数的raise意味着您的异常处理程序遇到了一个错误,因此Python构建了一个指向异常处理程序中的raise的新堆栈跟踪。

请注意,带有参数的raise在Python3上的行为有所不同,其中异常记录它们相关的跟踪。在Python3上,raise和raise ex都将保留原始的跟踪,但是raise ex将为raise ex行添加一个额外的跟踪记录。

此外,Python使用一个奇怪的跟踪构造系统,其中异常在最初引发时没有堆栈跟踪,并且每次它通过堆栈帧出现气泡时,都会向堆栈跟踪中添加一个额外的框架记录。(还为具有1或2个参数的raise添加了记录,但不添加0或3,因此在上一段中出现了差异。)由于这个跟踪构造系统,跟踪将不包含任何有关异常未传播到的帧的信息,而且异常异常处理模式可能导致跟踪看起来与初始raise点上的堆栈完全不一样。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38318576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档