一、异常

异常就是在触发异常条件时(解释器或程序员)而采取相应的措施

c++中异常使用try, throw, catch等关键字,而python中使用try, raise, except等

二、标准异常

1、综述:

python异常都是类,其中BaseException是所有异常的根基类

Exception, SystemExit, GeneratorExit, KeyboardInterrupt是直接有BaseEXception派生的

其他异常类都是直接或间由Exception派生

2、派生图:

3、标准异常(根据python核心编程外加python3源代码进行扩充修改):

    


三、检测与处理异常

1、try-except:
a.一个except:

try:
被检测的部分
except 异常类型:
异常处理部分

当被检测的部分出现指定的异常类型时,会执行异常处理部分;
没有出现指定异常时,忽略except中的语句

例子:

 try:
f = open('test.txt')
except FileNotFoundError:
print('This file is not exist!')
# 当不存在该文件时,输出指定语句
# 当文件存在时,则没有影响

也可以对特定的异常进行忽略处理:

try:
被检测的部分
except 异常类型:
pass

这样当出现特定异常时,可以忽略处理:

 try:
f = open('test.txt')
except FileNotFoundError:
pass # 这样,当文件不存在时,会忽略而继续运行程序

b.异常参数:
可以在异常部分后面加上:as 参数名
则可以通过该参数来保留错误的原因
例子:

 try:
f = open('test.txt')
except FileNotFoundError as e:
print(str(e))
print(e.args) '''输出:
[Errno 2] No such file or directory: 'test1.txt'
(2, 'No such file or directory')
''' # e为异常参数,保留了异常错误的原因
# e为一个错误编号和一个错误原因的字符串组成的tuple

c.多个except语句

try:
被监测部分
except 异常类型1:
处理1
except 异常类型2:
处理2
...

当被检测部分出现异常时,执行相应的异常处理部分
其余的except不会执行
例子:

 exp = input('Please input the math expression:')
try:
print(eval(exp))
except ZeroDivisionError as e:
print("0 can't be / or %")
except TypeError as e:
print(e) '''
输入:3 % 0
输出:0 can't be / or %
输入:3 & 1.5
输出:unsupported operand type(s) for &: 'int' and 'float'
'''

d.多个异常类型:

try:
被检测部分
except (异常类型1, 异常类型2, ...):
异常处理部分
...

多种异常类型进行同种处理

e.捕获所有异常:
由于Exception是所有异常的基类(除几个特殊的)
所有可以直接用Exception作为异常类型:

try:
被检测部分
except Exception:
处理
...

当然,如果连解释器的错误和用户强行中断也要捕获,可以用BaseException作为异常类型

注意,在捕获所有异常时,最好采取行动而不是pass掉,

一般只有对特定的异常才会采取忽略处理

例子:

f.综合实例(摘自《core python programming》):

 def safe_float(obj):
"""safe version of float(obj)"""
try:
retval = float(obj)
except (ValueError, TypeError) as diag:
# ValueError: 当传入str等
# TypeError: 当传入{},()等
retval = str(diag)
return retval def main():
"""handles all the data processing"""
log = open('cardlog.txt', 'w')
# 用来保留日志的文件
try:
ccfile = open('carddata.txt', 'r')
except IOError:
log.write('no txns this month\n')
log.close()
return txns = ccfile.readlines()
ccfile.close()
total = 0.0
log.write('account log:\n') for eachTxn in txns:
result = safe_float(eachTxn)
if isinstance(result, float):
total += result
log.write('data... processed\n')
else:
log.write('ignored: %s' % result)
# 忽略字符串,只对float处理
print('$%.2f (new balance)' % total)
log.close() if __name__ == '__main__':
main()

2、else语句:在try范围内没有异常被检测到时,执行此语句代码

try:
被监测部分
except 异常1:
处理1
except 异常2:
处理2
...
else:
处理

只有当异常1,异常2,... 都未被检测到时,才会执行else后面语句

例子:

3、finally语句:无论异常是否发生,都会执行该语句下的代码

a.try-except-finally:

try:
被检测部分
except 异常:
处理
...
finally:
语句块

finally下的语句块最终都会执行

当try范围内产生一个异常时,会立即跳转到finally语句

当finally语句执行完成后,继续向上一层引发异常

但是,如果finally中的代码发生异常或由于return, break, continue等终止时,则不会引发原异常

例子:

b.try-finally:

此处并没有except语句,所有目的并非是处理异常,

通过该模式是为了维持代码的执行,而不管异常发生与否

例子(信用卡例子关闭文件):

四、触发异常

可以通过raise语句来人为的引发异常(类似于c++中的throw)

raise someException, args, traceback

应用:

 # 只允许输入q或enter
try:
choice = input('Please input [enter]
to continue or [q] to quit:')
if choise not in ('q', '\n'):
raise IOError
except IOError:
print('Just can input [enter] or [q]')

五、断言

用于测试一个表达式,如果返回值为假则触发异常

try:
assert 表达式
except AssertionError:
处理

当表达式为假时,将会执行处理部分

用在产品发布之前,对程序的逻辑、文档、约定等进行检查
在生产环境时应去除断言
例子:

 try:
choice = input('Please input [enter]
to continue or [q] to quit:')
assert choise in ('q', '\n'), '
...

python入门四:异常的更多相关文章

  1. python入门19 异常及异常处理 异常捕获

    常见异常举例 """ 一些异常举例:""" '''模块不存在 ModuleNotFoundError: No module named 'd ...

  2. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  3. Python学习系列(四)Python 入门语法规则2

    Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, ...

  4. Python基本语法[二],python入门到精通[四]

    在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...

  5. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  6. python入门学习:9.文件和异常

    python入门学习:9.文件和异常 关键点:文件.异常 9.1 从文件中读取数据9.2 写入文件9.3 异常9.4 存储数据 9.1 从文件中读取数据 9.1.1 读取整个文件  首先创建一个pi_ ...

  7. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

  8. Python入门笔记(17):错误、异常

    一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象.当错误中断流程时,该程序将尝试寻找异常处理程序 ...

  9. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

随机推荐

  1. mac上制作u盘启动盘

    Mac上制作Ubuntu USB启动盘 一.下载ubuntu iso镜像 二.将iso转换为img文件 $ hdiutil convert -format UDRW -o /path/to/gener ...

  2. 第一百六十节,封装库--JavaScript,ajax注册表单到数据库

    封装库--JavaScript,ajax注册表单到数据库 效果图 前台js var biaodan = $().xu_lie_biao_dan($('form').sh_jd()); //序列化获取表 ...

  3. bgr to rgb

    因为在研究车牌识别算法(plr),遇到了算法 处理的格式问题,可分三个常用格式: 0:rgb 1:bgr 2:yuv422——需要注意的是,这里为啥选yuv422做识别,当然还可选yuv444,最坏打 ...

  4. 项目文件不完整。缺少预期导入,DotnetCore如何切换SDK版本

    1. 项目文件不完整.缺少预期导入 如图: 2. 出现原因: SDK版本与项目所需的SDK版本不一致. 3. 解决问题: 3.1 项目所需的SDK版本如何确定? a. 检查.sln文件所在目录是否有: ...

  5. js节流防抖应用场景,以及在vue中节流防抖的具体实现

    故事背景: 项目有个需求是输入框在输入的时候进行搜索,展示下拉数据,但是没必要输入一个字都进行搜索,所以想到了在输入结束200毫秒后再进行搜索,从而引出来了 js的节流(throttle),防抖(de ...

  6. Android 热修复 Tinker接入及源代码浅析

    本文已在我的公众号hongyangAndroid首发.转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/54882693本文出自张鸿 ...

  7. Request的属性和防止图片被盗链

    Request.AppRelativeCurrentExecutionFilePath,获取当前执行请求相对于应用根目录的虚拟路径,以~开头,比如"~/default.ashx" ...

  8. IOS-添加分段控件SegmentControl

    本文转载至 http://www.cnblogs.com/tx8899/archive/2012/06/05/2537020.html 添加分段控件 控件是一种小型的.自包含的UI组件,可以用在各种U ...

  9. python技巧之下划线(二)

    Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划 ...

  10. vijos P1740 聪明的质检员

    题目链接:传送门 题目大意:给你n个物品,每件物品有重量 W 和价值 V,给m个区间,和一个标准值.(n,m最大200000) 要求找到一个值x,使得m个所有区间的权值和与标准值的差的绝对值最小.单个 ...