错误、调试、测试

错误、调试、测试

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)

执行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值