Python如何使用完整堆栈信息冒泡异常

Python如何使用完整堆栈信息冒泡异常,python,Python,请参阅下面的代码 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) e

请参阅下面的代码

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)
如上所述,当清单中不包含'value'元素时,我不知道是哪一行引起了问题,我从日志中知道的只是map_values函数中的某个地方,如何从第一次引发异常的位置获取完整的堆栈跟踪?在这种情况下,obj=listing['value']

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

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意味着您正在发出异常处理程序遇到错误的信号,因此Python将构造一个指向异常处理程序中的raise的新堆栈跟踪

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

此外,Python使用了一种奇怪的回溯构造系统,其中异常在最初引发时没有堆栈跟踪,并且每次它通过堆栈帧冒泡时,都会向堆栈跟踪中添加一条额外的帧记录。对于带有1个或2个参数(而不是0或3个)的raise,也会添加一条记录,因此在上一段中存在差异。由于此回溯构造系统,回溯将不包含有关异常未传播到的帧的任何信息,异常异常处理模式可能会导致回溯与堆栈在初始提升点的外观完全不同。

在except子句中使用raise(不带参数)来重新提升正在处理的异常及其原始回溯:

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意味着您正在发出异常处理程序遇到错误的信号,因此Python将构造一个指向异常处理程序中的raise的新堆栈跟踪

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


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

只需提升它,而不是提升ex。只需提升它,而不是提升ex。这是可行的,你能解释一下加薪和公正的区别吗raise@JamesLin当前位置答案扩展。非常感谢,我从来没有机会深入了解这一点。这很有效,你能解释一下前加薪和公正加薪的区别吗raise@JamesLin当前位置答案扩展。非常感谢,我从来没有机会深入研究这个问题。