您的位置:首页 > 编程语言 > Python开发

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 调试程序
    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: