使用 try except [重复] 时递归打印异常详细信息
Posted
技术标签:
【中文标题】使用 try except [重复] 时递归打印异常详细信息【英文标题】:Print exception details recursively while using try except [duplicate] 【发布时间】:2017-10-23 16:11:23 【问题描述】:#!/usr/bin/env python
#import re
def test_ex1(input):
if re.match(r'^[A-Z]+$',input):
print 'Match'
return True
print 'No Match'
return False
#test_ex1('ABC')
try:
test_ex1('ABC')
except Exception:
raise Exception
如果我运行上述程序,它将打印以下异常消息。
a:~/Python> python test.py
Traceback (most recent call last):
File "test.py", line 18, in <module>
raise Exception
Exception
在不更改 test_ex1
子例程的情况下使用try except
捕获异常时,在 Python 中打印以下堆栈跟踪的正确方法是什么?
Traceback (most recent call last):
File "test.py", line 15, in <module>
test_ex1('ABC')
File "test.py", line 8, in test_ex1
if re.match(r'^[A-Z]+$',input):
NameError: global name 're' is not defined
【问题讨论】:
是否要重新引发异常? 看看the documentation 如何递归打印所有异常而不在函数内的每个函数中添加print_exc
调用?
【参考方案1】:
一种方法是使用traceback
模块
import traceback
try:
re.match()
except Exception:
traceback.print_exc()
【讨论】:
我可以在不接触test_ex1
子程序的情况下做到这一点吗?
@Jean 当然,你不必修改它。请尝试以下操作:在 except
正文中,只需编写 pass
。不会打印任何内容。现在,输入traceback.print_exc()
。将打印回溯。无需修改。
如果你的意思是你可以放弃这个并在test_ex1
块内使用test_ex1
那么是的,你可以。请注意,您可能需要更改参数的名称,input
是 python 中的内置函数。
谢谢。当 Python 似乎能够在本地打印堆栈跟踪时,为什么我必须 import traceback
?
我们导入它,以便我们可以根据需要处理回溯。我们需要使用 import 来做到这一点,因为 python 标准库很大,它被分隔在模块中,这样编译器就不必在每个程序中加载所有内容。【参考方案2】:
我曾经使用以下将所有回溯打印为:
import sys
try:
# code here
except Exception:
print(sys.exc_info()[0])
raise
关键字用于将错误抛到堆栈并在函数调用的上层处理。
【讨论】:
这没有回答问题。 OP 想要打印 traceback。 我在上面编辑了我的答案。我误解了这个问题。很抱歉。以上是关于使用 try except [重复] 时递归打印异常详细信息的主要内容,如果未能解决你的问题,请参考以下文章
当“try .. except IOError”未捕获时如何处理 FileNotFoundError?
如何让 Try except 输出更多细节?显示它到底发生在哪里? - Python [重复]