百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

[819]ScalersTalk成长会Python小组第10周学习训练日志

off999 2025-09-12 01:27 61 浏览 0 评论

Scalers点评:在2015年,ScalersTalk成长会完成Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小组是成长会内部小组,如果你想和我们一起学习Python,你需要是成长会成员,并且完成相关进群任务。

我们的节奏是行动是一周一章学到位,章节习题都会一个一个过。通过到位地执行,达到实质性的提升。

往期日志:

本周学习情况

本周(20160321-20160327)学习第10章,章节内容为《错误和异常》。本周复盘主持人为Seven。

本章主要内容

本章主要介绍了什么是异常,如何生成异常,异常处理,Python对异常的支持,如何创建自定义的异常类、断言。

本章主要知识点

10.1 什么是异常

10.1.1 错误

当 Python 检测到一个错误时,解释器会指出当前语句已经无法继续执行下去, 这时候就出现了异常。

  • 语法错误:必须在编译前解决。

  • 逻辑错误:运行时出现,如:非法的输入、边界值溢出等。

10.1.2 异常

异常是程序出现错误而在正常控制流以外采取的行为。

该行为分为两个阶段

  1. 产生异常:当符合异常的产生条件时,解释器就会触发一个异常。异常可以是Python解释器触发的,也可以是coder手动触发的。

  2. 处理异常:异常引发后,指示程序如何执行,是忽略错误继续执行还是终止程序。

异常处理的好处:使得程序具有在运行时管理错误的能力,在错误发生时采取可靠的补救措施。

10.2 Python 中的常见异常

  • ZeroDivisionError:除数为零

  • NameError:访问没有定义的变量

  • SyntaxError:唯一不是在运行时发生的异常,语法错误导致程序编译失败。

  • IndexError:请求的索引超出序列范围

  • KeyError:请求一个不存在的字典关键字

  • IOError:输入/输出错误

  • AttributeError:访问未知的对象属性

10.3 检测和处理异常

检测和处理异常有两种主要形式: try-excepttry-finally

10.3.1 try-except语句

try: try_suite # watch for exceptions here except Exception[, reason]: except_suite # exception-handling code 

try-except的处理流程:

  1. 异常被引发后,try语句块中异常发生点后的剩余语句不会被执行;

  2. Python 解释器搜索对应的异常处理器,一旦找到就开始执行处理器中的代码;

  3. 如果没有找到合适的异常处理器, 那么异常就自底向上移交给调用者去处理(最顶层也无法处理则退出程序)。

10.3.2 带有多个 excepttry语句

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 retval

10.3.3 同时处理多个异常的 except语句

def safe_float(obj): try: retval = float(obj) 
except (ValueError, TypeError): retval = 'argument must be a number or numeric string' return retval

10.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 retval

10.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子句前可以没有exceptelse子句

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 e

10.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, args

10.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. 关键字. 用来引发异常的关键字有那些?

raisetry

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更新)

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: