错误、调试、测试
1错误和异常
错误和异常的概念
错误:语法错误,逻辑错误(不完整或者不合法的输入或者计算出现问题)
异常:程序执行过程中出现问题导致程序无法执行
1,程序遇到逻辑或者算法问题 2.运行过程中计算机错误(内存不够或者IO错误)
2错误和异常的处理方式
1.Python常见错误
1.NameError:没有定义变量,直接饮用,则会出现NameError
2.SyntaxError语法错误: if true 例如:if a ,其中a没有定义,就会报SyntaxError
如果 if a: 则会报NameError
3.IOError: f=open(‘1.txt’) 打开一个不存在的文件
4.ZeroDivisionError:除数为0
5.ValueError:强制类型转换时候,a=int(‘dd’)
6.KeyboardInterrupt键盘终端错误:程序正在执行的过程中执行ctl+c
2.使用try-except 处理异常(1)
语法格式
try:
try_suite
exceptException [,e]:
exception_block
1.try用来捕获try_suite中的错误,并且将错误交给exception处理
2.except用来处理异常,如果处理异常和设置的异常一致,使用exception-block处理异常,如果异常不一致,则该异常则被解释器捕获处理,若果设置了[e]选项,则异常信息就会保存到e中
try:
a
except Exception,e:
print "catch except",e
print 'end over'
try-except捕获异常分析:
实践:猜数字游戏
1.开始游戏产生一个1-100的随机数
2.用户输入,游戏根据输入值提示大或者小
3.用户根据提示继续输入,直到猜中为止
4.如果用户输入错误,程序可以处理异常
import random
num= random.randint(0,100)
while True:
guess=int(raw_input("Enter 1~100:"))
if guess > num:
print 'guess Bigger',guess
elif guess < num:
print 'guess Smaller',guess
else:
print "Guess OK,Game Over!"
break;
print "\n"
修改:
import random
num=random.randint(0,100)
while True:
try:
guess=int(raw_input("Enter 1~100:"))
exceptValueError,e:
print"Enter 1~100 number"
continue
if guess > num:
print 'guess Bigger',guess
elif guess < num:
print 'guess Smaller',guess
else:
print "Guess OK,Game Over!"
break;
print "\n"
3.使用try-except 处理异常(2)
try-except:捕获处理多个异常
try:
try_suite
exceptException1 [,e]:
exception_block1
exceptException2 [,e]:
exception_block2
exceptExceptionN [,e]:
exception_blockN
try-except-else:如果想在代码后面再加一些语句,如果没有捕获异常则添加信息
else:如果没有捕获异常则执行else语句中代码
4.try-finally使用
语法:
try:
try_suite
finally:
do_finally
执行过程:
1.如果try语句乜有捕获错误,代码执行do_finally语句
2.如果try语句捕获错误,程序首先执行do_finally语句,然后将捕获到的错误交给Python解释器处理
所以该用法不是用来处理异常的
作用:用来关闭文件或者释放系统资源,比如多个进程进行通信时候,异常之前释放互斥锁
5.try-except-else-finally
try-except-finally语法:
try:
try_suite
except:
do_except
finally:
do_finally
执行过程:
1.若try语句乜有捕获异常,执行完try代码段后,执行finally
2.若try语句捕获异常,首先执行except处理错误,然后执行finally
try-except–else-finally语法:
try:
try_suite
except:
do_except
else:
do_else
finally:
do_finally
执行过程:
1.若try语句乜有捕获异常,执行完try代码段后,首先执行else代码段,再执行finally
2.若try语句捕获异常,首先执行except处理错误,然后执行finally
6.with-as语句
with语句语法:
with context [as var]:
with_suite
1.with语句用来代替try_except_finally语句,使代码更加简洁;
2.context 表达时返回的是一个对象,且要支持上下文协议
3.var用来保存context返回对象,单个返回值或者元组
4.with_suite使用var变量来对context返回的对象进行操作
with语句实例:
with open(./1.txt) as f:
for line in f.readlines():
print line
1.打开文件
2.f接收文件对象返回的对象
3with中的代码执行完成后,关闭文件若with中的代码块有异常或者错误首先执行关闭操作,然后再执行错误或者异常,若果没有异常发生,则自动关闭文件。
with open('./1.txt') as f:
print "with f.read:",f.read()
print "with end",f.closed
没有异常时的结果:
有异常时的结果:比如seek操作有异常
import os
with open('./1.txt') as f:
print "with f.read:",f.read()
f.seek(-5,os.SEEK_SET)
print "with end",f.closed
此时,文件没有被关闭,因为没有对IO错误进行处理,所以错误交给了解释器
当代码改成如下:
import os
try:
with open('./1.txt') as f:
print "with f.read:",f.read()
f.seek(-5,os.SEEK_SET)
except IOError,e:
print "in with catch IOError:",e
print "with end",f.closed
结果可见,文件已经被关闭了。
with只保证了文件可以被关闭,但是当遇到别的异常时候,并没有处理,直接抛给了解释器,所有需要程序员自己处理。
with语句实质是上下文管理:
1.上下文管理协议:包含方法__enter__()和__exit__(),支持该协议的对象必须要实现这两个方法,才能被with操作
2.上下文管理器:定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作
3.进入上下文管理器:调用管理器__enter__方法,如果设置as var语句,var变量接受__enter__()方法返回值
4.退出上下文管理器:当有异常或者退出时,则调用管理器__exit__方法,对资源进行清理,对文件进行关闭。
实例讲解:
class Mycontex(object):
def__init__(self,name):
self.name=name
def__enter__(self):
print"__enter__:"
returnself
defdo_self(self):
print"======do_self==="
a
def__exit__(slef,exc_type,exc_value,traceback):
print"__exit__:"
print"Error : ",exc_type," info: ",exc_value
if __name__=='__main__':
withMycontex('test context') as f:
printf.name
f.do_self()
with语句的应用场景:
1.文件操作
2.进程线程之间互斥对象,例如互斥锁
3.自定义的一些支持上下文的其他对象
3标准异常和自动异常
1.assert和raise语句
raise:语句用于主动抛出异常,例如在代码执行过程中,本身发现代码有问题就可以使用raise,使程序终止
语法格式:raise[exception[,args]]
exception:异常类
args:描述异常信息的元组
可以使用try-except截获抛出的异常,如果没有使用,则会根据解释器默认执行
assert语句:用于检测表达式是否为真,如果为假,引发AssertionError错误
语法:assertexpression [,args]
类中的方法对传入的参数有严格定义,或者对于重要的条件,都可以使用assert
可以结合try-exception对异常进行处理
2.标准异常和自定义异常
Python的标准异常:是python内建异常,程序执行前就已经存在
在python的官网中也可以查到所有的异常
自定义异常:
1.用于描述python中没有涉及到异常情况,比如用户在代码中触发自己的异常,
2.自定义异常必须继承Exception类
3.自定义异常只能主动触发
自定义异常实例:
class CustomError(Exception):
def__init__(self,info):
Exception.__init__(self)
self.errorinfo=info
printid(self)
def__str__(self):
return"CustomError:%s " % self.errorinfo
try:
raiseCustomError("test CustomError")
except CustomError,e:
print"Errorinfo:%d,%s" %(id(e),e)
执行结果: