如何打印更多的异常信息
使用try-except语句时,默认没有太多的调试信息,这会给代码的调试带来困难,通常我们只能知道某个函数出错了,但是该函数内容很多,问题无从查起。
为了解决这个问题,我们需要打印更多的信息,直接输出traceback信息是最好的方法。示例代码如下所示,经过a()->b()->c()的深层调用,最深层的c()抛出了异常,在最外面接住了,但是从接住的地方看,虽然有一些错误类型的相关信息,但是仍然很难找到抛出错误的地点。
import sys,traceback
def a():
return b()
def b():
return c()
def c():
return 1/0
try:
print(a())
except Exception as err:
print('Error:', err) # 打印默认信息
traceback.print_exc(file=sys.stdout) # 打印traceback
如果不加如打印traceback语句,结果如下:
('Error:', ZeroDivisionError('integer division or modulo by zero',))
如果加入打印traceback语句,则结果变得很漂亮:
Traceback (most recent call last):
File "app.py", line 13, in <module>
print(a())
File "app.py", line 4, in a
return b()
File "app.py", line 7, in b
return c()
File "app.py", line 10, in c
return 1/0
ZeroDivisionError: integer division or modulo by zero
try-except块会不会建立新的scope?
答案是不会的,try-except块中新建的变量都可以在块外部访问。
try:
a = 0
b = 1/0
except:
print('Error:')
print(a)
print(b)
运行结果
Error:
0
Traceback (most recent call last):
File "app.py", line 8, in <module>
print(b)
NameError: name 'b' is not defined
如果出现了变量未定义,那是因为程序抛出异常的时候提前退出,有可能变量还没有定义,如上代码所示,b没有定义并不是因为scope的原因,而是“b=1/0”这条语句没有成功执行,b自然也就没有定义。