《python学习手册》第35章 异常的设计
嵌套异常处理器
其实我们主要需要搞清楚的问题应该是这样的,当异常发生的时候,无论是简单的异常处理还是复杂的异常处理,我们都应该能够清楚的了解到异常运行到哪里,被谁捕获了,现在控制权到了哪里了,下面我们来分析嵌套异常处理的例子来说明上面说的这些问题。
以下是当异常发生的时候try/except和try/finally对于异常的处理:
下面我们将使用程序来看一下当异常发生的时候会出现什么状况:
使用嵌套的try/except的情况:
- def action2():
- print(1+[]) #TypeError
- try:
- try:
- action2()
- print('inner try')
- except TypeError:
- print('inner except')
- print('outer try')
- except TypeError:
- print('outter except')
运行结果如下
- inner except
- outer try
我们主要的目的是要了解情况的控制权在什么地方:当action2引发一个TypeError的时候,内部try/excpt的try模块后面信息不会继续执行,转而执行except的信息,当except将这个信息捕获的时候,执行except里面的信息,然后这个时候程序的控制权转到了try/except外面,然后外面的try/except因为没有发生异常,所以不会执行except里面的代码,程序继续转到try/except外面
try/finally是如何执行的
- try:
- try:
- raise IndexError
- print('inner try')
- finally:
- print('inner finally')
- print('outer try')
- finally:
- print('outer finally')
执行后的结果如下:
- inner finally
- outer finally
- Traceback (most recent call last):
- File "D:\application\eclipse\workspace\yichang\c4\t3.py", line 3, in <module>
- raise IndexError
- IndexError
说明当使用try/finally以后,当try当中出现错误的时候,执行完finally代码块以后,代码就会继续往上抛,不会进行错误的捕获,最终抛到了顶层,由默认异常处理器进行处理
try/excpet/finally进行嵌套时候的代码:
- def raise1(): raise IndexError
- def raise2(): return
- def raise3(): raise TypeError
- for func in (raise1,raise2,raise3):
- try:
- print('inner try')
- try:
- func()
- except IndexError:
- print('inner except ')
- print('outer try')
- finally:
- print('outer finally')
- print('\n')
运行结果如下:
- inner try
- inner except
- outer try
- outer finally
- inner try
- outer try
- outer finally
- inner try
- outer finally
- Traceback (most recent call last):
- File "D:\application\eclipse\workspace\yichang\c4\t4.py", line 9, in <module>
- func()
- File "D:\application\eclipse\workspace\yichang\c4\t4.py", line 3, in raise3
- def raise3(): raise TypeError
- TypeError
异常的习惯用法
1:异常不总是错误
错误总是异常,异常不总是错误。其实在在程序运行的过程当中,我们需要异常来配合我们的程序继续运行。有些异常时一些信号而已,比如EOFError还有SystemExit和KeyboardInterrupt异常等。
2:关闭文件和服务器连接
包括数据库等连接等情况,其实都有一个关闭连接的过程,这个时候使用try/finally。现在,我们有有了新的选择,那就是使用with/as来进行。
3:sys.exc_info
当使用空的except的时候,可以和sys.exc_info结合使用,来输出一些有用的信息,当有处理器处理的时候,sys_exc_info会存有(type,value,traceback)信息,当没有处理器处理错误的时候会返回(None,None,None)信息。
与异常有关的技巧
1:应该包装什么异常
其实,主要是关于我们对于异常的态度,不要我们学了异常以后,我们运行的任何代码又要加上异常处理,这样会让我们显得胆战心惊。我们有时候其实并不需要进行异常捕获,因为程序运行出现错误其实是我们需要的,我们可以修改这些错误。我们主要是在我们觉得经常会出现失败的地方进行异常捕获。try/finally则用在需要关闭的场所。在单个函数外面使用异常比在其内部使用多个异常好一些。
2:捕捉太多
当我们使用一个excpet的时候,我们可以捕获所有的异常,这样程序看上去异常的简洁,你也可以放心的运行你的代码,但是其实这个并不是很好的,我们应该能够尽可能精确地捕获我们需要的错误,否则,except会拦截我们程序不会出现的错误,分析下面的例子:
- mydic = {1:'a',2:'b'}
- try:
- x = mydic[3]
- except:
- x = None
- print(x)
其实,我们的代码的原意是这样的,当我们出现KeyError的时候,我们的x的值为None。假如我们的字典名字出现了错误,我们想要引发异常或者做一点不一样的事情,但是这个时候,我们的代码还会让x的值为None。
3:捕捉太少
捕捉太少出现的一个问题是,当我们修改程序的时候,我们需要在except里面增加我们的异常,所以这个时候可以使用高一等级的异常,来应对这种变化的情况。
《python学习手册》第35章 异常的设计的更多相关文章
- Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘
Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...
- Python学习手册(第4版)PDF高清完整版免费下载|百度云盘
Python学习手册(第4版)PDF高清完整版免费下载|百度云盘 提取码:z6il 内容简介 Google和YouTube由于Python的高可适应性.易于维护以及适合于快速开发而采用它.如果你想要编 ...
- 《Python学习手册 第五版》 -第14章 迭代和推导
承接上一章for循环的讲解,迭代和推导,是对for循环的一种深入的探索和扩展 本章重点内容 1.迭代 1)什么是迭代?都有哪些分类 2)常规的使用方法 3)多遍迭代器VS单遍迭代器 2.列表推导 1) ...
- 《Python学习手册 第五版》 -第13章 while循环和for循环
上一章已经讲过if条件语句,这章重点是循环语句:while.for 本章的重点内容 1.while循环 1)一般形式 2)break.continue.pass和循环的else 2.for循环 1)一 ...
- 《Python学习手册 第五版》 -第12章 if测试和语法规则
本章节的内容,主要讲解if语句,if语句是三大复合语句之一(其他两个是while和for),能处理编程中大多数逻辑运算 本章的重点内容如下: 1.if语句的基本形式(多路分支) 2.布尔表达式 3.i ...
- 《Python学习手册 第五版》 -第11章 赋值、表达式和打印
上一章对Python的语句和语法已经进行了基本的说明,接下来就是每个章节的详细说明,本章的主要内容就是标题中涵盖的三点:赋值语句.表达式语句.打印语句 本章重点内容如下: 1.赋值语句 1)赋值语句的 ...
- 《Python学习手册 第五版》 -第10章 Python语句简介
前面在开始讲解数据类型的时候,有说过Python的知识结构,在此重温一下 Python知识结构: 程序由模块组成 模块包含语句 语句包含表达式 表达式创建并处理对象 关于知识结构,前面已经说过我自己的 ...
- 《Python学习手册 第五版》 -第2章 Python如何运行程序
第二章主要讲解了Python的运行机制, 在开始之前,需要明确以下几点 因为<Python学习手册>这本书是面向市场很多人的,既然有很多人,就有很多不一样的需求和使用情况,这本书涵盖Pyt ...
- 《Python学习手册 第五版》 -第18章 参数
在函数的定义和调用中,参数是使用最多喝最频繁的,本章内容就是围绕函数的参数进行讲解 本章重点内容如下: 1.参数的传递 1)不可变得参数传递 2)可变得参数传递 2.参数的匹配模式 1)位置次序:从左 ...
随机推荐
- stegsolve使用探究
应该也不是工具的问题吧,更多的是图片.但是不知道咋取就写工具了. 比如:http://ctf5.shiyanbar.com/stega/chromatophoria/steg.png 我在想为毛要选择 ...
- 转:字符集和字符编码(Charset & Encoding)
转自:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html ——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创 ...
- linux内核sysfs详解【转】
转自:http://blog.csdn.net/skyflying2012/article/details/11783847 "sysfs is a ram-based filesystem ...
- openjudge-NOI 2.6-2988 计算字符串距离
题目链接:http://noi.openjudge.cn/ch0206/2988/ 题解: 首先,题目有误,少了一个添加操作 和求解LCS之类的思路类似 f[i][j]表示a序列中1..i的部分和b序 ...
- [How to] HBase的bulkload使用方法
1.简介 将数据插入HBase表中的方法很多,我们可以通过TableOutputFormat以Mapreduce on HBase的方式将数据插入,也可以单纯的使用客户端API将数据插入.但是以上方法 ...
- 记一次java内存溢出的解决过程
注:本文主要记录这次解决内存溢出问题的过程而不是具体问题. 最近在写一个搜索引擎,使用倒排索引结构进行文档检索,保存索引的基本思想是先将倒排列表保存到内存中一个有序Map里(TreeMap),然后当内 ...
- CentOS6.9下安装MariaDB10.2.11
yum groupinstall -y "Development Tools" yum install -y cmake openssl-devel zlib-devel yum ...
- find tar排除指定文件或目录操作及查找文件内容关键字
1.find查找排除单个目录 查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk find . -path "./sk" -prune -o -name "*. ...
- Rule Compilation error xxx cannot be resolved
说明:在eclipse中部署服务器时不报错,但在dos窗口中部署时报如下异常 原因:规则引擎drl文件文件中两个含义相同的变量的中文注释(只能用//,不能使用/**xxx*/或/*xxx*/)要保持相 ...
- c#中值类型和引用类型的区别
1. 值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 2. 值类型存取速度快,引用类型存取速度慢. 3. 值类型表示实际数据,引 ...