python异常处理

来源:互联网 发布:中国象棋训练软件 编辑:程序博客网 时间:2024/05/31 11:05

异常

在程序运行过程中,所发生的不正常的事件,就会中断正在运行的程序。

会发生异常的情况:

①读写文件时,文件不存在;②访问数据库时,数据库管理系统没有启动;③网络连接中断;④算术运算时,除数为零;⑤序列越界等等

错误:

指程序有缺陷,主要分为:语法错误和逻辑错误

语法错误:Python解释器无法解释,在程序执行前纠正

逻辑错误:因为不完整或者不合法的输入导致程序执行得不到预期结果


常见的内置异常分类:

异常类说明举例NameError尝试访问一个未声明的变量>>>fooZeroDivisionError除数为零>>>2/0SyntaxError解释器语法错误>>>forrIndexError请求的索引超出序列范围>>>iList[]
>>>iList[0]KeyError请求一个不存在的字典关键字idict={1:"A",2:"B"}
print idict[3]IOError输入输出异常fp=open('myfile')AttributeError尝试访问未知的对象属性class myClass()
    pass
my=myClass()
my.id

1.检查和处理异常

    通过try语句检查异常;任何在try语句块里的代码都会被检测,检查是否有异常发生

try语句主要包含两种形式: try - except   和 try - finally

1) try - except

#定义异常监控的一段代码,并且提供处理异常的机制

try:    语句  #被监控异常的代码except  异常类[,对象]:  (ps:通过对象获取异常信息)    语句  #异常处理的代码
语句执行顺序:
首先执行try语句块中的语句;

如果出现异常立即,立即中断try语句块的执行,转到except语句块;

将异常类型与except语句块中的异常匹配,如果匹配成功,执行相应的异常处理。如果匹配不成功将异常传递给更高一级的try语句;

如果异常一直没有找到处理程序则停止执行,抛出异常信息

如图:

while True:    str1='请输入第一个整数\n'    str2='请输入第二个整数\n'    print '开始执行除法运算\n'    try:        op1=input(str1)        op2=input(str2)        result=op1/op2        print '%d / %d = %d'%(op1,op2,result)    except ZeroDivisionError as e:        print e
2) else语句块

try 语句块中没有检测到异常,执行else语句块

try:    语句  #被监控的异常代码except 异常类[,对象]:    语句  #异常处理代码else:    语句  #try语句块的代码全部成功时的操作
while True:    str1='请输入第一个整数\n'    str2='请输入第二个整数\n'    print '开始执行除法运算\n'    try:        op1=input(str1)        op2=input(str2)        result=op1/op2    except ZeroDivisionError:        print '除数不能为零'    else:        print '%d / %d = %d'%(op1,op2,result)
3)带有多个的except的try语句

一个try语句块可以对应多个except语句块

try:    语句  #被监控异常的代码except 异常类1[,对象]:    语句  #异常处理的代码except 异常类n[,对象]:    语句  #异常处理的代码

del safe_float(obj):    try:        retval=float(obj)    except ValueError:        retval='文本不能转换为float数据'    except TypeError:        retval='类型错误'    return retval

4)异常继承结构

①BaseException类是所有异常之母

②Exception类是其他异常子类的父类(ps:常规错误的基类)

③如果多个except语句块同时出现在同一个try语句中,异常的子类应出现在其父类之前

④引发多种类型的异常:

a.排列except语句的顺序:先子类后父类

b.发生异常时按顺序逐个匹配

c.只执行第一个与异常类型匹配的except语句

del safe_float(obj):    try:        retval=float(obj)    except ValueError:        retval='文本不能转换为float数据'    except TypeError:        retval='类型错误'    except Exception as e:        retval='存在异常'    return retval


5)处理多个异常的except语句

一个except语句块可以处理多个异常,处理多个异常时,要求异常放置在一个元组里

try:    语句  #被监控异常的代码except (异常类1[,异常类2[,异常类n]])[,对象]:    语句  #异常处理的代码
del safe_float(obj):    try:        retval=float(obj)    except (ValueError,TypeError):        retval='文本或类型不符,不能转换为float数据'    except Exception as e:        retval='存在异常'    return retval

6) finally语句块
①无论是否发生异常都会执行的一段代码

②可以与try语句块一起使用 (ps:只能有一个finally语句块)

try - except - finally

try - except - else - finally

try - finally

③通常用来释放占用的资源,例如:关闭文件,关闭数据库的连接

例如:

try:    语句  #被检测异常的代码except 异常类[,对象]:    语句  #异常处理的代码[else:    语句] #try语句块的代码全部成功时的操作finally:    语句  #无论如何都执行

fp=Nonetry:    fp=open('D:/BigData/first.py','w+')    fp.write('hello')except IOError:    print '读写有误'except Exception:    print '操作有误'else:    fp.seek(3)    f=fp.readlines()    print ffinally:    fp.close()    print '关闭文件'

7)异常抛出

除了系统自动抛出异常外,在编辑过程中,有些问题是系统无法发现并解决的。例如程序要求文件名不能是"_hello_",此时需要程序员自动抛出异常,把问题提交给调用者去解决。通过抛出异常,接收并处理异常,实现程序的多分支处理。

格式:

raise的常用格式:①raise 异常类  ② raise 异常类(参数或元组)

def filename():    filename=raw_input('please input file name\n')    if filename=='xiaoliu':        raise NameError('不能输入此姓名')    return filenamewhile True:    try:        filename=filename()        print '名字是%s'%filename        break    except NameError:        print '请换一个名字!'


8.与Java中异常的区别

  1)java中的异常:

a.处理异常的方式或者关键词:

try 、catch、finally、throw、throws

b.异常的种类和体系结构

Throwable

Error ——不可恢复的异常

Exception

检查异常——所有的Exception子类,所有的非RuntimeException子类

特点:要求客户或者程序员try或者throws

运行时异常——所有的RuntimeException子类

特点:客户程序员不必手动处理

例如:system.in.read()

主动引发运行时异常

例如:throw new RuntimeException()

  2)python中的异常:

a.处理异常的方式或者关键词:

try、except、else、finally、raise

b.异常的种类和体系结构

没有检查异常,只有运行时异常,

详细解释,请看上面的例子!!









原创粉丝点击