python异常处理

6 篇文章 0 订阅
1 篇文章 0 订阅

异常

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

会发生异常的情况:

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

错误:

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

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

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


常见的内置异常分类:

异常类说明举例
NameError尝试访问一个未声明的变量>>>foo
ZeroDivisionError除数为零>>>2/0
SyntaxError解释器语法错误>>>forr
IndexError请求的索引超出序列范围>>>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=None
try:
    fp=open('D:/BigData/first.py','w+')
    fp.write('hello')
except IOError:
    print '读写有误'
except Exception:
    print '操作有误'
else:
    fp.seek(3)
    f=fp.readlines()
    print f
finally:
    fp.close()
    print '关闭文件'

7)异常抛出

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

格式:

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

def filename():
    filename=raw_input('please input file name\n')
    if filename=='xiaoliu':
        raise NameError('不能输入此姓名')
    return filename
while 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.异常的种类和体系结构

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

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









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值