您的位置:首页 > 编程语言 > Python开发

python自学之异常

2015-10-24 19:08 495 查看
异常,按照我的理解,就是指错误或者意外的结果,有些会导致程序崩溃,有些会产生我们不期待的结果。

当程序在运行过程中出现异常时,如果我们没有进行适当的处理,那么程序就会走向结束或者朝着一个我们不希望看到的结果发展。

无论是从增强程序运行时的鲁棒性角度,还是从开发时的调试方便角度,异常都值得我们关注---一个非常有用的部分(异常还有一些比较巧妙的实用技巧)

其实我在看完python的异常部分之后,只有一个想法:

那就是和C++、java的异常机制基本上一样,看来现在的面向对象语言在很多地方都是相通的(这让我想到,高中数学老师经常拿来说的一句话,数学在高处中是相通的)

真的好像......

不废话了,进入正题。

水平有限,如果叙述中错误,欢迎指出。

我就以问题的形式展开的异常的复习。(嗯,对我来说是复习,写这一系列主要是就是做个总结笔记)

1. 什么是异常?

前面已经叙述。这里再深入一下,其实除了导致程序运行报错的异常外,其他的异常都可以包含在"不期待的结果"这一大的定义下。有时候,这种不期待的结果是程序运行过程中可能产生的意外结果,但是我们也可以人为产生一个异常的可能源,这种行为可以有非常巧妙的实用。

python是一门OO语言/脚本,所以具有非常强的面向对象特征。异常在python中是对象,所有系统定义的异常类都是Exception类的子类。

2. 如何捕捉异常?

其实捕捉异常,与我们无关,语言自带的异常机制会帮我们捕捉异常、处理异常(如果你没有指定异常处理的代码)。

我们所要做的是什么?很简单,就是按照异常机制指定的”框架“来做事,这个”框架"就是

try:

#可能引发异常的代码

except [parm1,...]:

#处理代码

else:

#处理代码

finally:

#必须执行的代码

根据框架,我们可以进一步来学习。

当异常发生时,会寻找能够处理该类型的异常的代码。所有处理异常的代码都在except后。

注意:一个try可以对应多个except,一个except后可以接多个异常类(需要以元祖形式)

如果没有捕捉到能处理该异常的代码,那么会执行else后的代码。

无论异常是否被引发,都会执行finally后的代码。

多个except,只会执行第一个能处理该异常的代码.

那么问题来了,什么叫能处理该异常的代码呢?看下面的例子

try:

x=1/0

excet TypeError:

print 'a typeerror found'

except ZeroDivisionError:

print "a ZeroDivisionError found"

这段代码运行时由于除数为0引发一个ZeroDivisionError类型的异常,那么在后面的几个except中,异常参数只要是ZeroDivisionError或者是其父类,我们都认为该except对应的处理代码是能够处理该异常的代码。

3. 如何定义自己的异常类?

内建(build-in)的异常类毕竟是有限的,不可能涵盖所有的异常,最重要的是我们往往希望将某些不期待的行为作为异常,结合OO思想,我们很自然就会想自己定义一个异常类咯。

我们希望自已定义的异常类,在发生我们不期待的行为时,能够像内建的异常类一样工作。为了能达到这样的效果,在很多OO语言中,常见的做法是,让自己定义的异常类继承内建的异常类。

例如:

class myExcept(Exception):

pass

4. 异常处理有哪些作用?

首先,我们得明白,当异常发生时,寻找可处理对应异常的代码的规则,也就是怎么找?其实很简单,就是根据调用的堆栈顺序找,由最内层找,然后再往调用该函数的上一层代码中找,直至找到主程序(就是被系统直接调用代码)。

那么如果异常引发后,未找到对应的处理代码,那么解释器就会打印出traceback信息,即调用函数的信息。如此一来,可以有助于我们调试,帮助我们知道bug所在处。

另外异常处理使得我们的程序不会无故崩溃,所以使得我们的程序更加健壮。

细心的读者会发现,其实整个异常处理的“框架”和switch语句结构有惊人的相似之处!其实异常处理的框架也可以作为我们进行程序设计的一种有效语句结构,使异常处理

在某些方面很实用。(其实也就是类似于switch语句,只不过比switch语句更适合某些特定的场景、更自然~)

参考资料:《python基础教程》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: