请参阅以下代码
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']
发布于 2016-07-12 01:23:21
使用在raise子句中不带参数的except来重新处理您正在处理的异常及其原始跟踪:
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点上的堆栈完全不一样。
https://stackoverflow.com/questions/38318576
复制相似问题