博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python3.2官方文档翻译--异常处理
阅读量:4171 次
发布时间:2019-05-26

本文共 2306 字,大约阅读时间需要 7 分钟。

8.3 异常处理

编写可以处理可选择的异常是可能的。 看看下面的例子,要求用户输入一个合法的整数类型,但是允许用户打断程序()用control-c或者其他操作系统支持的语言;注意一个用户产生的终端会引发一个keyboardInterrupt 异常。

>>> while True:

... try:

... x = int(input("Please enter a number: "))

... break

... except ValueError:

... print("Oops! That was no valid number. Try again...")

...

Try语句如下工作:

l 首先,执行try句子里面内容。(在tryexcept关键字之间的语句)

l 如果没有异常发生,except语句就会跳过,try语句执行就结束。

l 如果在执行try语句过程中异常发生,剩下的语句就会跳过。 如果发生的 异常名称和except关键字之后的异常相同, except语句就会执行,它时在try语句之后执行的。

l 如果发生没有与except语句异常名称相匹配的异常,它就传递给try语句外部。如果发现没有处理的异常,就会抛出没有处理的异常并且打印出如上面的异常信息。

为了具体处理不同的异常,Try语句可以包含许多except语句。在但最多只有一个异常处理。 处理器只能处理发生发生在相应的try语句中的异常。而不是相同的try中发生的其他异常。

一个execpt可能作为一个括号括起来的元组里,命名多个异常,例如:

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

... Pass

最后一个except子句可以省略异常名称,以作为通配符使用。你需要谨慎使用这个。因为用这种方式很容易隐藏一个实际的程序错误。可以使用这种方法打印一条错误信息,然后重新抛出异常。(允许调用这处理这个异常)

import sys

try:

f = open(myfile.txt)

s = f.readline()

i = int(s.strip())

except IOError as err:

print("I/O error: {0}".format(err))

except ValueError:

print("Could not convert data to an integer.")

except:

print("Unexpected error:", sys.exc_info()[0])

Raise

try ... Except语句中也可以选择添加else语句,如果它存在,必须跟在所有except语句的后面,如果try语句不不想上抛一个异常但但又让接后的代码执行,那么这个语句就非常有用。例如:

for arg in sys.argv[1:]:

try:

f = open(arg, r)

except IOError:

print(cannot open, arg)

else:

print(arg, has, len(f.readlines()), lines)

f.close()

 

使用else子句要比在try后面添加代码要好,因为它可以避免额外的捕捉异常。它们并不是由try... :keywordexcept语句保护的代码所抛出。

当一个异常发生时,它可能有相关联的值,也可以成为异常的参数。参数的存在与类型依赖于异常的类型。

Except语句可以在异常名称后描述一个变量。这个变量与包含参数的异常实例相互绑定。为了方便起见,异常实例定义了_str_()方法以至于不需要调用参数.args可以直接打印参数。你也可以抛出异常前先实例化它,然后给它添加任何想要的属性。

>>> try:

... raise Exception(spameggs)

... except Exception as inst:

... print(type(inst)) # the exception instance

... print(inst.args) # arguments stored in .args

... print(inst) # __str__ allows args to be printed directly,

... # but may be overridden in exception subclasses

... x, y = inst.args # unpack args

... print(x =, x)

... print(y =, y)

...

<class Exception>

(spameggs)

(spameggs)

x = spam

y = eggs

 

如果异常还有参数,对于没处理的异常将会打印在异常信息中的最后一部分中。

异常处理器不仅仅处理那些try子句中立刻发生的异常,也会处理那些try子句中调用的函数内部发生的异常:例如:: 

>>> def this_fails():

... x = 1/0

...

>>> try:

... this_fails()

... except ZeroDivisionError as err:

... print(Handling run-time error:, err)

...

处理运行时的错误: int division or modulo by zero

转载地址:http://mskai.baihongyu.com/

你可能感兴趣的文章
2019.2.28
查看>>
2019.2.29
查看>>
聊聊我当年在培训学校做开发的经历
查看>>
用Docker搭建Redis主从复制的集群
查看>>
盘点这些年我出的书,以及由此得到的收获
查看>>
用Python的Pandas和Matplotlib绘制股票KDJ指标线
查看>>
面试必问:对java多线程里Synchronized的思考
查看>>
最近接了本分布式组件面试书的选题,请大家一起来提意见
查看>>
Redis整合MySQL和MyCAT分库组件(来源是我的新书)
查看>>
Java程序员普遍存在的面试问题以及应对之道(新书第一章节摘录)
查看>>
程序员高效出书避坑和实践指南
查看>>
计算机方面毕业生怎样写简历
查看>>
从软件公司的异同点讲起,聊聊未来的程序员该如何选公司和谋规划
查看>>
我不想安于当前的限度,以达到所谓的幸福,回顾下2020年的我
查看>>
如何在面试中介绍自己的项目经验(面向java改进版)
查看>>
通过写n本书的积累,我似乎找到了写好技术文章的方法(回复送我写的python股票电子书)
查看>>
如果很好说出finalize用法,面试官会认为你很资深
查看>>
Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能
查看>>
分析若干没面试机会和没体现实力的简历
查看>>
用python的matplotlib和numpy库绘制股票K线均线
查看>>