《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)位置次序:从左 ...
随机推荐
- Mysql储存过程6: in / out / inout
in 为向函数传送进去的值 out 为函数向外返回的值 intout 传送进去的值, 并且还返回这个值 )) begin then select 'true'; else select 'false' ...
- imperva系统升级遇见的错误(配置文件的导入导出)
今天心态有点炸了 今天去东兴证券做waf升级.浪费了两天才弄完.把客户都弄得有点急了.好歹原厂的工程师耐心的讲解这才弄完.感谢路哥.... 赶紧总结一下. 事情是这样的.东兴 证券的imperva是v ...
- 37 - 网络编程-UDP编程
目录 1 UDP协议 2 UDP通信流程 3 UDP编程 3.1 构建服务端 3.3 常用方法 4 聊天室 5 UDP协议应用 1 UDP协议 UDP是面向无连接的协议,使用UDP协议时,不需要建立连 ...
- React 16 源码瞎几把解读 【前戏】 为啥组件外面非得包个标签?
〇.看前准备 1.自行clone react最新代码 2.自行搭建一个能跑react的test项目 一.看表面:那些插件 如何解析JSX 有如下一段代码: // ---- hearder.jsx 组件 ...
- Petrozavodsk Winter Training Camp 2018
Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸 ...
- css给奇数行或偶数行添加指定样式
odd表示奇数行,even表示偶数行; tr:nth-child(odd); .table-striped > tbody > tr:nth-child(odd) { background ...
- json数据操作
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- 洛谷 P1296奶牛的耳语 题解
题目传送门 这道题很显然可以用O(n2)的方法来做(记得排序),由于数据较水...但还是在for循环中加一些优化:++i,据说这样会快一些... #include<bits/stdc++.h&g ...
- php正则匹配以“abc”开头且不能以“xyz”结尾的字符串
本文介绍下,用php正则区配以"abc"开头的,且不能以"xyz"结尾的字符串的方法,有需要的朋友参考下. 要求:用php正则表达式匹配以“abc”开头,但结尾 ...
- Asp.net vNext 学习之路(二)
View component(视图组件)应该是MVC6 新加的一个东西,类似于分部视图.本文将演示在mvc 6中 怎么添加视图组件以及怎么在视图中注入一个服务. 本文包括以下内容: 1,创建一个新的a ...