《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里面增加我们的异常,所以这个时候可以使用高一等级的异常,来应对这种变化的情况。

时间: 2024-10-12 06:14:36

《python学习手册》第35章 异常的设计的相关文章

《Python学习手册 第五版》 -第11章 赋值、表达式和打印

上一章对Python的语句和语法已经进行了基本的说明,接下来就是每个章节的详细说明,本章的主要内容就是标题中涵盖的三点:赋值语句.表达式语句.打印语句 本章重点内容如下: 1.赋值语句 1)赋值语句的特点(注意事项) 2)赋值语句的形式:基本形式.元组及列表解包赋值.序列赋值.扩展的序列解包.多目标赋值.增量赋值 3)变量命名规则 2.表达式语句 1)常见的表达式语句 2)表达式语句和原位置修改 3.打印操作 1)调用形式 2)应用示例 以下是针对以上重点内容的详细说明 1.赋值语句 1)赋值语

《Python学习手册 第五版》 -第12章 if测试和语法规则

本章节的内容,主要讲解if语句,if语句是三大复合语句之一(其他两个是while和for),能处理编程中大多数逻辑运算 本章的重点内容如下: 1.if语句的基本形式(多路分支) 2.布尔表达式 3.if三元表达式 以下是针对重点内容的详细说明 1.if语句的基本形式 if语句是根据测试结果,从一些备选的操作中做出选择的语句,也就是说要先计算测试结果,再选择做什么,基本形式如下: if test1: statements1 elif test2: statements2 else: stateme

《Python学习手册 第五版》 -第16章 函数基础

前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函数 1)什么是函数? 2)为什么使用函数? 2.编写函数 1)函数的基本格式 2)定义和调用函数 3)函数的多态.局部变量 接下来针对本章重点,展开详细的说明 1.函数 1)什么是函数? 这里没有严格的定义,用通俗易懂的方式来说: 函数就是将一些语句集合在一起的组件,从而让他们能够不止一次的在程序中

Python学习手册笔记

之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书配套答案请到http://www.hzbook.com/Books/4572.html下载,简单注册即可. 第三章 如何运行程序 impor

《Python学习手册》读书笔记【转载】

转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书

python学习手册——1介绍python对象类型

在python ,数据以对象的形式出现--无论是python提供的内置对象,还是使用python或是像C扩展库这样的扩展语言工具创建的对象.尽管在以后才能确定这一概念,但对象无非是内在中的一部分,包含数值和相关操作的集合. 由于对象是python 最基本的概念,从这一章开始我们将会全面地体验python的内置对象类型. python程序可以分解成模块,语句,表达式以及对象,如下所示: 1.程序由模块构成 2.模块包含语句 3.语句包含表达式 4.表达式建立并处理对象 为什么使用内置类型 1.内置

《Python 学习手册》笔记 1

今天看了 Udacity 的 iOS 学习路线介绍,作者的看法是,最好先学习 Swift,而不是 Objective-C,原因一方面是 Swift 要简单一些,另一方面是因为 Apple 打算用 Swift 作为将来的官方语言取代 OC. 大学里,编程语言课程就是 C 和 C++.我不知道这是谁定的,也许他们有足够充分的理由.但是对于大多数人来说,这两个语言——一个太底层,一个太复杂)其实不见得那么重要.还不如学学 Ruby 和 Python 这样的抽象度更高的解释性语言,易于使用,而且内置了强

python学习手册

1.GUI开发 python中界面开发使用wxPython库,开发手册 wxPytyhon in action; *  http://wiki.woodpecker.org.cn/moin/WxPythonInAction *  http://blogimg.chinaunix.net/blog/upfile2/090208120235.pdf python学习手册

global语句(python学习手册422页)

# -*- coding: cp936 -*- #python 27 #xiaodeng #global语句(python学习手册422页) #实际上就是一个名为__builtin__的模块,但是必须要import之后才能使用,因为变量名builtin本身并没有预先内置 #global语句,命名空间的声明,告诉python计划生成一个或多个全局变量. #全局变量名小结: #1.全局变量是位于模块文件内部的顶层的变量名 #2.全局变量如果是在函数内被赋值的话,必须要经过global声明 #3.全局