Python用异常对象(exception object)来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理和捕获,程序就会终止执行。如果这些错误信息就是异常的全部功能,那么它也就不必存在了。事实上,每个异常都是一些类的实例,这些实例可以被引发,并且可以用很多方法进行捕捉,使得程序可以捕捉错误并且对其进行处理,而不是让整个程序失效。
异常捕获:
try:
可能出现异常的语句
except 异常类型,变量:
print 变量
finally:
语句
- try:里面是可能产生异常的代码,如果执行正确,则expert语句块不会执行,如果执行错误,直接跳转至错误处理代码except语句块;
- except: 捕获异常,
- finally:无论是否有异常,都执行该代码;
try: #在捕获到一个异常后就结束try后的其他语句
# a = 10 / 0
# a = []
# print a[3]
# a = 1
print 1
print a
except (ZeroDivisionError,IndexError), e: #e只是个变量
print e
finally:
print "game over....."
try:
a = 10 / 0
# a = []
# print a[3]
# a = 1
print 1
print a
except Exception, e: #Exception是所有异常的父类
print e
finally:
print "game over....."
抛出异常
关键字:raise,抛出异常,程序执行结束。
def get_age(age):
if age<0:
print 1
raise Exception("Age is not legal") #"()"中的提示语可以不写
print 2
get_age(-1)
print 3
if __name__=="__main__":
pass
自定义异常:
class AgeError(Exception):
pass
def get_age(age):
if age<0:
print 1
raise AgeError("Age is not legal")
print 2
get_age(-1)
print 3
if __name__=="__main__":
pass
调试
1>print
print适当的代码块结果来进行调试,简单直接粗暴。用print最大的坏处是需要删掉它,运行结果也会包含很多垃圾信息。
2>断言assert
- 用print来辅助查看的地方,都可以用assert来代替;
- 如果断言失败,assert语句本身就会抛出AssertionError。
- python解释器执行时可以用-O参数关闭assert,把所有的saaert语句当成pass。
- 缺点:非此即彼
断言错误时:
b=abs(-1)
print type(b)
assert type(b)==str,"b is int"
print b
if __name__=="__main__":
pass
断言正确时:
b=abs(-1)
print type(b)
assert type(b)==int,"b is str"
print b
if __name__=="__main__":
pass
3>logging模块
logging不会抛出错误,将结果输出到文件;
- logging.basicConfig(level=logging.INFO)指定记录信息的级别,有debug,info,warn,error,critical等几个级别。默认warn及以上记录。
import logging
logging.info("info")
logging.warn("warn")
logging.critical("critical")
import logging
logging.basicConfig(level=logging.INFO)
logging.info("info")
logging.warn("warn")
logging.critical("critical")
import logging
logging.basicConfig(level=logging.INFO)
logging.info("info")
logging.warn("warn")
logging.critical("critical")
a=1
logging.info("a=%d"%a)
if __name__=="__main__":
pass
4>pdb模块
- pdb让程序以单步方式运行
import pdb
s=0
s=s+1
n=str(s)
print n
if __name__=="__main__":
pass
调试:
view—>Tool Windows—>Terminal
python -m pdb myTest.py
n #单步执行
c #继续执行
p 变量 #查看变量
q #退出
设置断点:(程序会自动在断点处暂停并进入调试环境)
pdb.set_trace()
import pdb
s=0
s=s+1
pdb.set_trace()
n=str(s)
print n
if __name__=="__main__":
pass