前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Python基础教程》 读书笔记 第八章 各种各样的Erro

《Python基础教程》 读书笔记 第八章 各种各样的Erro

作者头像
统计学家
发布2019-04-10 16:00:14
3840
发布2019-04-10 16:00:14
举报

8.1什么是异常

Python用异常对象(exception object)来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行

8.2按自己的方式出错

8.2.1raise语句

为了引发异常,可以使用一个类(应该是Exception的子类)或者实例参数调用raise语句。使用类时,程序会自动创建实例。下面是一些简单的例子,使用了内建的Exception异常类:

>>> raise Exception Traceback (most recent call last): File "<input>", line 1, in <module> Exception >>> raise Exception('hyperdrive overload') Traceback (most recent call last): File "<input>", line 1, in <module> Exception: hyperdrive overload

第一个例子raise Exceptioin引发了一个没有任何有关错误信息的普通异常。后一个例子中,则添加了一些hyperdive overload错误信息。

一些内建异常:

Exception 所有异常的基类

AttributeError特性引用或赋值失败时引发

IOError试图打开不存在文件(包括其他情况)时引发

IndexError在使用序列中不存在的索引时引发

KeyError在使用映射中不存在的键时引发

NameError在找不到名字(变量)时引发

SyntaxError在代码为错误形式时引发

TypeError在内建操作或者函数应用于错误类型的对象时引发

ValueError在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发

ZeroDivisionError在除法或者模除操作的第二个参数为0时引发

8.3捕捉异常

关于异常的最有意思的地方就是可以处理它们(通常叫做诱捕或者捕捉异常)。这个功能可以使用try/except来实现。假设创建了一个让用户输人两个数,然后进行相除的程序,像下面这样:

>>> x=input('enter the first number:');y=input('input the second number;') enter the first number: 1 input the second number;>? 0 >>> print x/y Traceback (most recent call last): File "<input>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero

为了捕捉异常并且做出一些错误处理:

try: x=input('enter the first number:') y=input('enter the second number:') print x/y except ZeroDivisionError: print "the second number can't be zero"

结果:

enter the first number:5

enter the second number:0

the second number can't be zero

考虑一下一个能“屏蔽”ZeroDivisionError(除零错误)的计算器类。如果这个行为被激活,那么计算器就会打印错误信息,而不是让异常传播。如果在与用户进行交互的过程中使用,那么这就有用了,但是如果是在程序内部使用,引发异常会更好些。因此“屏蔽”机制就可以关掉了,下面是这样一个类的代码:

>>> class MuffledCalculator: ... muffled=False ... def calc(self,expr): ... try: ... return eval(expr) ... except ZeroDivisionError: ... if self.muffled: ... print 'division by zero is illegal' ... else: ... raise ...

打开和关闭屏蔽

>>> calculator=MuffledCalculator() >>> calculator.calc('10/2') 5 >>> calculator.calc('10/0') Traceback (most recent call last): File "<input>", line 1, in <module> File "<input>", line 5, in calc File "<string>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero >>> calculator.muffled=True >>> calculator.calc('10/0') division by zero is illegal

8.4不止一个except子句

为了捕捉异常,可以直接在同一个try/except语句后面加上另一个except子句:

>>> try: ... x=input('fisrt number:') ... y=input('second number:') ... print x/y ... except ZeroDivisionError: ... print "second number can't be zero" ... except TypeError: ... print "that wasn;t a number" ... fisrt number: 1 second number:>? 0 second number can't be zero

8.5用一个块捕捉两个异常

如果需要用一个块捕捉多个类型异常,那么可以将它们作为元组列出

try: x=input('enter the first number:') y=input('enter the second number:') print x/y except (ZeroDivisionError,TypeError,NameError): print 'your numbers were bogus...' enter the first number:1 enter the second number:a your numbers were bogus...

8.6捕捉对象

如果希望在except子句中访问异常对象本身,可以使用两个参数(注意,就算要捕捉到多个异常,也只需向except子句提供一个参数—一个元组)。比如,如果想让程序继续运行,但是又因为某种原因想记录下错误(比如只是打印给用户看),这个功能就很有用。下面的示例程序会打印异常(如果发生的话),但是程序会继续运行:

try: x=input('enter the first number:') y=input('enter the second number:') print x/y except (ZeroDivisionError,TypeError),e: print e enter the first number:1 enter the second number:0 integer division or modulo by zero

8.7真正的全捕捉

用一段代码捕捉所有异常,那么可以在excep七子句中忽略所有的异常类:

try:

x=input('enter the first number:')

y=input('enter the second number:')

print x/y

except:

print 'something wrong happened...'

enter the first number:illegal

something wrong happened...

8.8最后

finally子句。它可以用来在可能的异常后进行清理。它和try子句联合使用:

x=None try: x=1/0 finally: print 'cleaning up...' del x Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/untitled/xl.py", line 3, in <module> x=1/0 ZeroDivisionError: integer division or modulo by zero cleaning up...

可以在同一条语句中组合使用try,

except, finally和else(或者其中3个)。

try: x=1/0 except NameError: print "unknown variable" else: print 'that went well' finally: print 'cleaning up...'

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档