python 第十七周 异常处理与程序调试
2015-06-25 12:43
806 查看
第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 调试程序
相关文章推荐
- python使用__future__
- python偏函数
- Python中的zipfile模块使用详解
- python正则表达式复习2
- Python - Timer Threads
- python装饰器
- python装饰器
- python模块threading实现多线程
- python自然语言处理学习笔记1
- Python正则表达式指南
- python学习笔记
- python元组、列表的异同总结
- python元组、列表的异同总结
- Python 3 + Sulime Text 2 输出中文出错
- python自定义包使用
- python 去除 list 重复元素
- Python标准库3.4.3-webbrowser-21.1
- Python解析HDF文件
- Python解析HDF文件
- Python解析HDF文件 分类: Python 2015-06-25 00:16 743人阅读 评论(0) 收藏