分享
 
 
 

Python编程入门(7)

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

第八章 错误与例外

到现在为止我们只是提到了错误信息而没有详细讨论,如果你运行了前面的例子可能已经看到了一些错误信息。至少有两种不同错误:句法错和例外错(exceptions)。

8.1 句法错

句法错也称为语法分析错,是你在学习Python的时候最可能犯的错误。 >>> while 1 print 'Hello world'

File "<stdin>", line 1

while 1 print 'Hello world'

^

SyntaxError: invalid syntax

语法分析器重复出错行,并用一个小‘箭头’指向行内最早发现错误的位置。错误是由箭头前面的记号引起的(至少是在这里检测到的)。在本例中,错误在关键字print处检测到,因为它前面应该有一个冒号(“:”)。错误信息中显示了文件名和行号这样如果错误发生在一个脚本文件中你就知道到哪里去找。

8.2 例外

即使语句或表达式句法没有问题,在试图运行的时候也可能发生错误。运行时检测到的错误叫做例外,这种错误不一定必然是致命的:你很快就会学到如何在Python程序中处理例外。然而,多数例外不能被程序处理,这是会产生错误信息,如:

>>> 10 * (1/0)

Traceback (innermost last):

File "<stdin>", line 1

ZeroDivisionError: integer division or modulo

>>> 4 + spam*3

Traceback (innermost last):

File "<stdin>", line 1

NameError: spam

>>> '2' + 2

Traceback (innermost last):

File "<stdin>", line 1

TypeError: illegal argument type for built-in operation

错误信息的最后一行显示发生的情况。例外有不同的类型,类型作为错误信息的一部分显示:上例中错误的类型有ZeroDivisionError、NameError和TypeError。作为例外类型显示的字符串是发生的例外的内置名。这对于所有内置例外成立,但对用户自定义例外不一定成立(用户最好能遵守这样的约定)。标准例外名是内置的标识符(不是保留关键字)。

此行的其余部分是错误的细节,其解释依赖于例外类型。错误信息前面的部分以堆栈反跟踪的形式显示了发生错误的上下文环境。一般这包含了列出源代码行的一个列出源程序行的堆栈反跟踪;然而,它不会显示从标准输入读进的行。

库参考手册列出了内置例外和其含义。

8.3 例外处理

可以编程序来处理选定的例外。请看下面的例子,显示一些浮点数的倒数: >>> numbers = [0.3333, 2.5, 0, 10]

>>> for x in numbers:

... print x,

... try:

... print 1.0 / x

... except ZeroDivisionError:

... print '*** has no inverse ***'

...

0.3333 3.00030003

2.5 0.4

0 *** has no inverse ***

10 0.1

try语句是这样工作的:

首先,运行try子句(在try和except之间的语句)。

如果没有发生例外,跳过except子句,try语句运行完毕。

如果在try子句中发生了例外错误而且例外错误匹配except后指定的例外名,则跳过try 子句剩下的部分,执行except子句,然后继续执行try语句后面的程序。

如果在try子句中发生了例外错误但是例外错误不匹配except后指定的例外名,则此例外被传给外层的try语句。如果没有找到匹配的处理程序则此例外称作是未处理例外,程序停止运行,显示错误信息。

try语句可以有多个except子句,为不同的例外指定不同处理。至多只执行一个错误处理程序。错误处理程序只处理相应的try子句中发生的例外,如果同try语句中其它的错误处理程序中发生例外错误处理程序不会反应。一个except子句可以列出多个例外,写在括号里用逗号分开,例如:

... except (RuntimeError, TypeError, NameError):

... pass

最后一个except子句可以省略例外名,作为一个通配项。这种方法要谨慎使用,因为这可能会导致程序实际已出错却发现不了。

try ... except语句有一个可选的else子句,如有的话要放在所有except子句之后。else 的意思是没有发生例外,我们可以把try子句中没有发生例外时要做的事情放在这个子句里。例如:

for arg in sys.argv[1:]:

try:

f = open(arg, 'r')

except IOError:

print '不能打开', arg

else:

print arg, '有', len(f.readlines()), '行'

f.close()

例外发生时可能伴有一个值,叫做例外的参数。参数是否存在及其类型依赖于例外的类型。对于有参数的例外,except在自居可以在例外名(或表)后指定一个变量用来接受例外的参数值,如:

>>> try:

... spam()

... except NameError, x:

... print 'name', x, 'undefined'

...

name spam undefined

有参数的例外未处理时会在错误信息的最后细节部分列出其参数值。

例外处理程序不仅处理直接产生于try子句中的例外,也可以处理try子句中调用的函数(甚至是间接调用的函数)中的例外。如:

>>> def this_fails():

... x = 1/0

...

>>> try:

... this_fails()

... except ZeroDivisionError, detail:

... print 'Handling run-time error:', detail

...

Handling run-time error: integer division or modulo

8.4 产生例外

raise语句允许程序员强行产生指定的例外。例如: >>> raise NameError, 'HiThere'

Traceback (innermost last):

File "<stdin>", line 1

NameError: HiThere

raise语句的第一个参数指定要产生的例外的名字。可选的第二参数指定例外的参数。

8.5 用户自定义例外

程序中可以定义自己的例外,只要把一个字符串赋给一个变量即可。例如: >>> my_exc = 'my_exc'

>>> try:

... raise my_exc, 2*2

... except my_exc, val:

... print 'My exception occurred, value:', val

...

My exception occurred, value: 4

>>> raise my_exc, 1

Traceback (innermost last):

File "<stdin>", line 1

my_exc: 1

许多标准模块用这种方法报告自己定义的函数中发生的错误。

8.6 定义清理动作

try语句还有另一个finally可选子句,可以用来规定不论出错与否都要执行的动作。例如:

>>> try:

... raise KeyboardInterrupt

... finally:

... print 'Goodbye, world!'

...

Goodbye, world!

Traceback (innermost last):

File "<stdin>", line 2

KeyboardInterrupt

finally子句不论try子句中是否发生例外都会执行。例外发生时,先执行finally子句然后重新提出该例外。当try语句用break或return语句退出时也将执行finally子句。

要注意的是,try语句有了except子句就不能有finally子句,有了finally子句就不能有except 子句,不能同时使用except子句和finally子句。需要的话可以嵌套。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有