类似于Java的try..catch..finally
Java的为try_except_finally
try:
print('try...')
r = /
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
try执行一段可能会发送异常的代码,如果有异常情况发送 走except , 如果没有则不走,最后不管代码有没有发送异常,都会执行finally里的代码
异常错误存在父子类问题,如果父类处理了,子类则不会再接收处理
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
调试
1、打印print
最简单的就是print 把数据打印出来再去找错误原因
问题在于会在代码中出现很多打印语句
2、断言assert
assert n != 0, 'n is zero!'
assert
的意思是,表达式n != 0
应该是True
,否则,根据程序运行的逻辑,后面的代码肯定会出错。
如果断言失败,assert
语句本身就会抛出AssertionError
:
$ python err.py
Traceback (most recent call last):
...
AssertionError: n is zero!
注:
程序中如果到处充斥着assert
,和print()
相比也好不到哪去。不过,启动Python解释器时可以用-O
参数来关闭assert
:
关闭后,你可以把所有的assert
语句当成pass
来看。
$ python -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
3、logging
logging
的好处,它允许你指定记录信息的级别,有debug
,info
,warning
,error
等几个级别,当我们指定level=INFO
时,logging.debug
就不起作用了。同理,指定level=WARNING
后,debug
和info
就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
logging
的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。
import logging
logging.basicConfig(level=logging.INFO) s = ''
n = int(s)
logging.info('n = %d' % n)
print( / n)
--------------------------------------------
$ python err.py
INFO:root:n =
Traceback (most recent call last):
File "err.py", line , in <module>
print( / n)
ZeroDivisionError: division by zero