[819]ScalersTalk成长会Python小组第10周学习训练日志
off999 2025-09-12 01:27 35 浏览 0 评论
Scalers点评:在2015年,ScalersTalk成长会完成Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小组是成长会内部小组,如果你想和我们一起学习Python,你需要是成长会成员,并且完成相关进群任务。
我们的节奏是行动是一周一章学到位,章节习题都会一个一个过。通过到位地执行,达到实质性的提升。
往期日志:
本周学习情况
本周(20160321-20160327)学习第10章,章节内容为《错误和异常》。本周复盘主持人为Seven。
本章主要内容
本章主要介绍了什么是异常,如何生成异常,异常处理,Python对异常的支持,如何创建自定义的异常类、断言。
本章主要知识点
10.1 什么是异常
10.1.1 错误
当 Python 检测到一个错误时,解释器会指出当前语句已经无法继续执行下去, 这时候就出现了异常。
语法错误:必须在编译前解决。
逻辑错误:运行时出现,如:非法的输入、边界值溢出等。
10.1.2 异常
异常是程序出现错误而在正常控制流以外采取的行为。
该行为分为两个阶段:
产生异常:当符合异常的产生条件时,解释器就会触发一个异常。异常可以是Python解释器触发的,也可以是coder手动触发的。
处理异常:异常引发后,指示程序如何执行,是忽略错误继续执行还是终止程序。
异常处理的好处:使得程序具有在运行时管理错误的能力,在错误发生时采取可靠的补救措施。
10.2 Python 中的常见异常
ZeroDivisionError:除数为零NameError:访问没有定义的变量SyntaxError:唯一不是在运行时发生的异常,语法错误导致程序编译失败。IndexError:请求的索引超出序列范围KeyError:请求一个不存在的字典关键字IOError:输入/输出错误AttributeError:访问未知的对象属性
10.3 检测和处理异常
检测和处理异常有两种主要形式: try-except和try-finally。
10.3.1 try-except语句
try: try_suite # watch for exceptions here except Exception[, reason]: except_suite # exception-handling code try-except的处理流程:
异常被引发后,
try语句块中异常发生点后的剩余语句不会被执行;Python 解释器搜索对应的异常处理器,一旦找到就开始执行处理器中的代码;
如果没有找到合适的异常处理器, 那么异常就自底向上移交给调用者去处理(最顶层也无法处理则退出程序)。
10.3.2 带有多个 except的try语句
def safe_float(obj): try: retval = float(obj)
except ValueError: retval = 'could not convert non-number to float' except TypeError: retval = 'object type cannot be converted to float' return retval10.3.3 同时处理多个异常的 except语句
def safe_float(obj): try: retval = float(obj)
except (ValueError, TypeError): retval = 'argument must be a number or numeric string' return retval10.3.4 异常的层次结构
|- BaseException |- KeyboardInterrupt |- SystemExit |- Exception |- (all other current built-in exceptions)10.3.5 异常参数
# multiple exceptions
except (Exception1,..., ExceptionN)[, reason]: suite_for_Exception1_to_ExceptionN_with_Argument上面的reason是一个包含异常代码诊断信息的类实例,异常参数自身会组成一个元组并存储为reason的属性args。
获取异常的错误信息:
def safe_float(object): try: retval = float(object)
except (ValueError, TypeError), e: retval = str(e)
return retval10.3.6 else子句
else子句执行的条件:try范围中的所有代码没有引发异常
try: module.function
except:
print 'error'
else:
print 'success'10.3.7 finally子句
finally子句:是无论是否有异常发生,都会执行的一段代码。
10.3.8 try-finally语句
try: A
finally: B当在 try范围中产生一个异常时会立即跳转到finally语句,当finally语句执行完毕后会继续向上一层引发异常。
10.3.9 try-except-else-finally语句
try: A
except MyException: B
else: C
finally: D结果:A-C-D[正常] 或 A-B-D[异常]
10.3.10 try语句后跟子句的总结
有
else子句则一定要有except子句finally子句前可以没有except或else子句
10.4 上下文管理
10.4.1 with 语句
with语句用来简化try-except-finally语句,仅工作于支持上下文管理协议(context management protocol)的对象。
with open('/etc/passwd', 'r') as f:
for eachLine in f:
# ...do stuff with eachLine or f... #10.4.2 上下文管理协议
上下文管理器必须实现的方法:
__context__:提供上下文对象__enter__:完成 with 语句块执行前的准备工作__exit__:当 with 语句块执行结束调用
contextlib模块的functions/decorators,可以方便地创建上下文管理器。
10.5 字符串作为异常(过时)
Python 1.5 前,标准的异常是基于字符串实现的,但是从现在起建议使用异常类。
10.6 触发异常
通过 raise语句,可手动触发异常。
语法:raise [SomeException [, args [, traceback]]]
SomeException:字符串/异常类/实例args:异常的参数是一个元组traceback:用于exception—normally的追踪对象
例子:
try:
raise IOError, 'raise test'
except IOError, e:
print e10.7 断言
assert可用于触发异常:如果断言成功不采取任何措施,否则触发AssertionError。
语法:assert expr[, args]
实例:
try: assert 1 == 0, 'One does not equal zero silly!'
except AssertionError, args:
print '%s: %s' % (args.__class__.__name__, args)
# AssertionError: One does not equal zero silly!断言的原理:
def assert(expr, args=None): if _ _debug_ _ and not expr:
raise AssertionError, args10.8 标准异常
所有的标准/内建异常、自定义异常都是继承自根异常 BaseException。
(其他信息见 10.2 Python中的常见异常 和 10.3.4 异常的层次结构)
10.9 使用异常的目的与好处
目的:为了使程序足够健壮,可以处理理应用级别的错误(不至于灾难性地影响其执行环境),并提供用户级别的错误信息。
好处:异常不仅简化代码,而且简化整个错误管理体系。
10.10 异常和 sys 模块
通过 sys模块中exc_info获取异常信息。
import sys
try: float('abc123')
except: exc_tuple = sys.exc_info
print exc_tuple
""" (<type 'exceptions.ValueError'>, ValueError('could not convert string to float: abc123',), <traceback object at 0x0000000002AB3848>) """sys.exc_info得到的元组是:
exc_type:异常类exc_value:异常类的实例exc_traceback:追踪对象,提供了发生异常的上下文,包含代码的执行帧、异常发生时的行号等信息。
10.11 异常相关的标准库
exceptions:内建异常
contextlib:使用with语句的上下文对象工具
sys:包含各种异常相关的对象和函数(见sys.ex*)
本章与其他语言相比
try-except后面可以跟else子句,而在Java里没有这样的语法。Python的
with语法简化了try-except-finally,在Java8里类似try-catch
本章课后习题
10–1. 引发异常. 以下的哪个因素会在程序执行时引发异常? 注意这里我们问的并不是异常的原因.
a) 用户
b) 解释器
c) 程序
d) 以上所有
e) 只有 b) 和 c)
f) 只有 a) 和 c)
10–2. 引发异常. 参考上边问题的列表, 哪些因素会在运行交互解释器时引发异常?
I/O(文件不存在、读取错误)、系统错误、边界值溢出等。
10–3. 关键字. 用来引发异常的关键字有那些?
raise、try
10–4. 关键字. try-except 和 try-finally 有什么不同?
try-except:当try代码块运行出错,except代码块才会被执行(匹配到相应异常时),处理完异常后try-except后的代码会继续往下执行;try-finally:不管try代码块是否出现异常,最终都会执行finally里的代码。如果出现异常,执行完finally代码块后,异常会继续往上层抛。
10–5. 异常. 下面这些交互解释器下的 Python 代码段分别会引发什么异常(参阅表 10.2 给出的内建异常清单):
(a) >>> if 3 < 4 then: print '3 IS less than 4!' (b) >>> aList = ['Hello', 'World!', 'Anyone', 'Home?'] >>> print 'the last string in aList is:', aList[len(aList)] (c) >>> x (d) >>> x = 4 % 0 (e) >>> import math >>> i = math.sqrt(-1)(a) SyntaxError
(b) IndexError
(c) NameError
(d) ZeroDivisionError
(e) ValueError
10–6. 改进的 open. 为内建的 open 函数创建一个封装. 使得成功打开文件后, 返回文件句柄; 若打开失败则返回给调用者 None , 而不是生成一个异常. 这样你打开文件时就不需要额外的异常处理语句.
def myopen(path, access='r'): try: f = open(path, access)
except (IOError, ValueError):
return None return f
if _ _name_ _ == '__main__':
print myopen("test.txt", 'abc')10–7. 异常. 下面两段 Python 伪代码 a) 和 b) 有什么区别? 考虑语句 A 和 B 的上下文环境.
(a) try: statement_A
except . . .: . . .
else: statement_B (b) try: statement_A statement_B
except . . .: . . .情况1:如果statement_A执行出错,则(a)和(b)都不会执行statement_B;
情况2:如果statement_A执行正常,则(a)和(b)都会执行statement_B——但是,如果statement_B的执行也出错,(b)可以在except子句里捕获到异常并做处理,而(a)则只能将statement_B产生的异常抛给上层调用者。
10–8. 改进的 raw_input . 本章的开头, 我们给出了一个”安全”的 float 函数, 它建立在内建函数 float 上, 可以检测并处理 float 可能会引发的两种不同异常. 同样, raw_input 函数也可能会生成两种异常, EOFError (文件末尾 EOF, 在 Unix 下是由于按下了 Ctrl+D 在 Dos 下是因为 Ctrl+Z) 或 是 KeyboardInterrupt (取消输入 , 一 般是由于按下了Ctrl+C). 请创建一个封装函数 safe_input , 在发生异常时返回 None .
def safe_input(msg): data = None try: data = raw_input(msg)
except (EOFError, KeyboardInterrupt):
pass
return data
if _ _name_ _ == '__main__':
print safe_input("please input: ")10–9. 改进的 math.sqrt. math 模块包含大量用于处理数值相关运算的函数和常量. 不幸的是, 它不能识别复数, 所以我们创建了 cmath 模块来支持复数相关运算. 请创建一个 safe_sqrt 函数, 它封装 math.sqrt 并能处理负值, 返回一个对应的复数.
import math, cmath
def safe_sqrt(num): try: result = math.sqrt(num)
except ValueError: result = cmath.sqrt(num)
return result
if _ _name_ _ == '__main__':
print safe_sqrt(123)
print safe_sqrt(-123)复盘总结
异常的处理使得程序具有在运行时管理错误的能力,即使发生问题也可以采取可靠的补救措施。(领域间找关联:类比S君描述行动系统里的“抗风险地做”)
10.3.10那一小节里,作者有个地方写错:“这一节最重要的是无论你选择什么语法,你至少要有一个 except 子句,而 else 和 finally 都是可选的.”。提醒我们在学习的时候,要带着批判和怀疑的眼光去学习,而不是一味地接受别人的观点。
ScalersTalkID:scalerstalk
本微信公众号作者Scalers,游走在口译世界的IT从业者。微信公众号ScalersTalk,网站ScalersTalk.com,口译100小时训练计划群C 456036104
成长会是由Scalers发起的面向成长、实践行动,且凝聚了来自全球各地各行各业从业者的社群。有意入会者请和Scalers直接联系,我和其他会员会和你直接交流关于成长行动等各方面的经验教训。2016年成长会持续招募中,参见做能说会写的持续行动者:ScalersTalk成长会2016年会员计划介绍(2016.3更新)
相关推荐
- u盘莫名其妙要格式化(u盘总是要格式化什么意思)
-
如果您在使用U盘时突然收到提示需要格式化的消息,这可能是由于以下原因之一引起的:U盘感染病毒:U盘中可能存在恶意病毒,这些病毒可能会导致U盘无法正常使用。当您尝试打开U盘时,系统会提示您进行格式化操作...
- win7家庭版原版(win7家庭版价格)
-
你的win7旗舰版应该是个盗版软件,在你使用的过程中你可能触碰到了后台升级,升级完以后就变成了家庭版了,在你不知不觉中被改变的,厄这个软件属于盗版的,厄升级完以后没什么大区别,这个旗舰版家庭版在家里面...
- win10自动更新失败怎么办(win10自动升级失败)
-
安装更新失败有许多原因。WindowsUpdate需要能够扫描您的计算机以了解需要哪些更新,并能够下载和安装这些更新。如果某个阶段遇到问题,则可能阻止某个更新安装到计算机中。有关错误或失败的详细信...
- 截图的几种方法(截图的几种方法有哪些)
-
第一种截图方式:按printScreen键。按一下键盘上的printScreen键以后,整个屏幕会被截取下来,截图会默认保存在剪贴板中。第二种截图方式:使用微信截图。进入聊天界面,我们会发...
- 电脑装了两个系统怎么切换(电脑安装2个系统怎么更换启动)
-
1.点击运行打开电脑点击左下角的开始菜单栏选项,右击鼠标在序列栏中选择运行打开。2.输入msconfig接着在运行的输入框中输入msconfig点击确定即可打开系统配置。3.点击引导打开系统配置的页面...
- linux系统哪个版本好用(最好linux系统版本)
-
个人比较推荐Debian这个发行版本。DebianGNU/Linux于1993年首次公布,至今已经有近30年历史了。当然其他版本比如openSUSE,Slackware,ArchLinux,Ubu...
- win10激活在哪里查看(win10激活时间在哪里看)
-
在Windows10中,您可以通过以下方法查看激活状态:方法1:使用“设置”应用1.点击屏幕左下角的“开始”按钮,然后点击“设置”(齿轮图标)。2.在设置窗口中,点击“系统”图标。3.在“系统...
- 官方win10dll文件修复工具(官方win7dll文件修复工具)
-
当电脑丢失dll文件时,可以采用以下几种方法进行一键修复:从回收站还原:如果是不小心误删了一些计算机文件,导致电脑出现异常的情况时,首先就可以去回收站找回dll文件,如果文件还在,就可以通过还原操作来...
- qq所有历史旧版本大全(qq历史版本一览表)
-
有2种方法。一种是:你是QQ会员。你可以把旧版打开,聊天记录上传。然后打开新的QQ,下载。第2种是:你在硬盘上装了QQ软件,然后你就点卸载(uninst),把原来的卸了。然后按原位置覆盖,装上06版。...
- 电脑显示器分辨率怎么调(显示分辨率无法调整)
-
1、以win7为例,首先右键点击桌面,在右键菜单中直接显示了屏幕分辨率的选项,用鼠标点击一下这个选项。2、在分辨率设置选项页面中,有一个分辨率的选项,点击一下这个选项,上面默认显示的数值是你现在的屏幕...
- 8系统(8系统点检控制包含什么)
-
WIndows8系统是微软目前最新的操作系统,Moto的图形界面设计,使很多已经习惯于早期windows系统的用户难以接受,Windows8是一个向平板和桌面系统妥协的产物,存在着相当多的利弊。...
- 电脑软件管家(电脑软件管家在哪里找到)
-
电脑管家有着最大的安全云库,全新的杀毒引擎,深度清理电脑垃圾,为电脑重回巅峰状态,更有账号宝专版,10倍提升QQ防盗号能力,是很好用的。就自己而言,在电脑上用的是腾讯电脑管家这个第三方系统安全软件,管...
- 迅雷种子搜索器(迅雷种子搜索器手机版下载)
-
迅雷种子搜索方法: 1.在开始菜单栏或者到文件的安装路径文件夹中找到P2P种子搜索器。&nb...
- 手机怎么解压文件(苹果手机怎么解压文件)
-
手机解压文件方法:1、首先,在手机中找到文件管理,打开文件管理。2、打开文件管理之后找到压缩包,然后打开。3、打开安装包之后,选择需要的文件,。4、接下来找到“解压至”,点击“解压至”。5、点击之后,...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
慕ke 前端工程师2024「完整」
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
