python 第十七周 异常处理与程序调试

第9章  异常处理与程序调试

9.1   异常的处理

9.1.1  python中的异常

       异常(Exception)是指程序中的例外、违例情况。
    python2.5中的异常定义在exception模块中,并继承自基类BaseException。
    Exception类是常用的异常类,包括:StandardError, StopIteration , GeneratorExit  , Warning.等类
    1、StandardError 是python的错误异常,如果程序中出现逻辑错误,将引发该异常,它包括如下图的常见异常,使用时,不需要导入exceptions模块。 
    2、StopIteration类判断循环是否执行到尾部,如果到尾部则抛出该异常。
    3、GeneratorExit 类由Generator函数引发的异常,当调用close()时引发该异常。
    4、Warning 类表示程序中的代码引起的警告。


9.1.2   try ... except  使用方法

      try 子句放置可能出现的异常语句,except子句处理异常。
# try...except
try:
    file("hello.txt", "r")
    print "读文件"
except IOError:                 # 捕获IOError异常
    print "文件不存在"
except:                         # 其他异常情况
    print "程序异常"

# try...except...else       #try子句发生异常,程序直接跳转except子句,反之,程序将执行else子句。
try:
    result = 10/0
except ZeroDivisionError:
    print "0不能被整除"        
else:                                   
    print result


# try...except的嵌套
try:                                
    s = "hello"
    try:                           
        print s[0] + s[1]
        print s[0] - s[1]
    except TypeError:                     
        print "字符串不支持减法运算"
except:
    print "异常"

    #TypeError: 'str' object does not support item assignment
    
如果外层try子句中的代码块引发异常,程序将直接跳转到外层except子句,内部try子句不会被执行。

9.1.3  try...finally 使用方法

      在try...except语句后还可以添加1个finally 子句,无论异常是否发生,finally子句都会被执行。所有的finally子句通常用于关闭因异常而不能释放的资源。
# try...except...finally
try:                                
    f = open("hello.txt", "r") 
    try:                 
        print fsock.read(5)
    except:
        print "读取文件错误"
    finally:                            # finally子句一般用于释放资源
        print "释放资源"    
        f.close()                     #变量f的全局性
except IOError: 
    print "文件不存在" 
注意:由于Python动态语言的特殊性,要在某个代码块中使用同一级其他代码块中定义的变量,可以考虑以嵌套的方式或全局变量来实现。

9.1.4  使用raise 抛出异常

           raise语句直接显式引发异常。一旦执行了raise语句,raise后面的语句代码将不能被执行。
import exceptions
try:
    s = None
    if s is None:    
        print "s是空对象"
        raise NameError
    print len(s)
except:

    print "空对象没有长度"

print help(exceptions)

9.1.5  自定义异常

       自定义异常必须继承Exception类。按照命名规范以“Error"结尾。
from __future__ import division

class DivisionException(Exception):                 # 自定义异常
    def __init__(self, x, y):
        Exception.__init__(self, x, y)
        self.x = x
        self.y = y

if __name__ == "__main__":
    try:
        x = 3
        y = 2                         
        if x % y > 0:
            print x / y  
            raise DivisionException(x, y)           # 抛出异常
    except DivisionException, div:
        print "DivisionException: x / y = %.2f" % (div.x / div.y)

9.1.6  assert语句的使用方法

         assert语句用于检测某个条件表达式是否为真。该语句又称断言语句,即assert认为检测的表达式永远为真。如果断言失败,会引发AssertionError异常
# assert判断逻辑表达式
t = ("hello",)
assert len(t) >= 1
#t = ("hello")
#assert len(t) == 1

# 带message的assert语句
month = 13
assert 1 <= month <= 12, "month errors"
#assert month >= 1 and month <= 12, "month errors"
Python支持形如:m <= x <= n  的表达式。

9.1.7  异常信息

def fun():                          # 除法运算g
    a = 10
    b = 0
    return a / b

def format():                       # 格式化输出
    print "a / b = " + str(fun())

if __name__ == "__main__":
    format()

Traceback (most recent call last):
  File "F:/python语言学习/开发详解光盘/自写程序/3.py", line 13, in <module>
    format()
  File "F:/python语言学习/开发详解光盘/自写程序/3.py", line 10, in format
    print "a / b = " + str(fun())
  File "F:/python语言学习/开发详解光盘/自写程序/3.py", line 7, in fun
    return a / b
ZeroDivisionError: integer division or modulo by zero

    程序执行时,python将产生traceback对象,用于记录异常信息和当前程序状态 。上面代码,traceback对象先记录主程序的状态,然后记录format()中的状态,最后记录fun()中的状态。当fun()出现异常时,traceback对象将输出记录的信息。因此,异常信息应从下往上阅读,最后1次出现的行号通常就是错误的发生处。

9.2  使用PythonWin  调试程序
9.3  使用Eclipse for Python 调试程序
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值