博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python3学习笔记16-错误和异常
阅读量:6537 次
发布时间:2019-06-24

本文共 2011 字,大约阅读时间需要 6 分钟。

使用try...except可以处理异常

异常处理

import systry:    print('try...')    r = 10/0    print('result:',r)except ZeroDivisionError as e:#    print('except:',e)finally:    print('finally...')print('end')

如果在try语句块中出现错误,剩下try部分剩下的语句不会继续被执行

如果异常类型和except之后的名称相符,就会执行对应的except下的语句

如果有finally语句块,则执行finally语句块,至此,执行完毕

把0改成2,由于没有错误发生,except部分会不执行,但是finally如果有,则一定会被执行(可以没有finally语句)

 

 

捕获多个异常

try:    print('try...')    r = 10/int('a')    print('result:',r)except ValueError as e:    print('ValueError:',e)except ZeroDivisionError as e :    print('ZeroDivisionError:',e)print('finally')

int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError,用另一个except捕获ZeroDivisionError

一个try语句可能有多个except子句,分别来处理不同的异常

 

except (RuntimeError,TypeError,NameError):#	pass

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组

#可以在except后面加个else,当没有错误发生的时候,会自动执行else语句

for arg in sys.argv[1:]:    try:        f = open(arg, 'r')    except IOError:        print('cannot open', arg)    else:        print(arg, 'has', len(f.readlines()), 'lines')        f.close()

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到的、而except又没有捕获的异常

 

异常处理并不仅仅处理那些直接发生在try子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常

def foo(s):    return 10 / int(s)def bar(s):    return foo(s) * 2def main():    try:        bar('0')    except Exception as e:        print('Error:', e)    finally:        print('finally...')

函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:

也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦

 

Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”

try:    foo(2)except ValueError as e:    print('ValueError')except UnicodeError as e:    print('UnicodeError')

第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类,如果有,也被第一个except给捕获了

 

抛出异常

使用raise语句可以抛出一个指定的异常

try:    raise NameError('HiThere')except NameError:    print('An exception flew by!')    raise

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)

只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出

转载于:https://www.cnblogs.com/myal/p/9337414.html

你可能感兴趣的文章
ffmpeg+SDL2实现的视频播放器「退出、暂停、播放」
查看>>
2011/7/3 第二次评审
查看>>
Openvswitch手册(2): OpenFlow Controller
查看>>
Cocos2d-JS项目之二:studio基础控件的使用
查看>>
tar解压
查看>>
oracle中创建dblink
查看>>
inheritprototype原型继承封装及综合继承最简实例
查看>>
【磁耦隔离接口转换器】系列产品选型指南
查看>>
Apriori 关联算法学习
查看>>
二叉树、红黑树、伸展树、B树、B+树
查看>>
Junit核心——测试集(TestSuite)
查看>>
MVPArms官方首发一键生成组件化,体验纯傻瓜式组件化开发
查看>>
Log4j_学习_00_资源帖
查看>>
制作iso镜像U盘自动化安装linux系统
查看>>
JSLint的使用
查看>>
cobbler 无人值守-介绍
查看>>
命令行常用命令--软连接
查看>>
(30 gadget day 7) 姑娘,请问您的相位是多少 - SmartScope
查看>>
关于SpringMVC中如何把查询数据全转成String类型
查看>>
tomcat运行错误
查看>>