#Chapter 8 异常
Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
#8.1 什么是异常
>>> 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
#8.2 按自己的方式出错
#8.2.1 raise语句
>>> raise Exception
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception
>>> raise Exception('hyperdrive overload')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception: hyperdrive overload
>>> import exceptions
>>> dir(exceptions)
['ArithmeticError', 'AssertionError', 'AttributeError', ...]
>>> raise ArithmeticError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ArithmeticError
#8.2.2 自定义异常类
>>> class SomeCustomException(Exception): pass
...
#8.3 捕捉异常
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!"
#打开或关闭屏蔽
class MuffleCalculator:
muffled = False
def calc(self, expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print 'Division by zero is illegal'
else:
raise
calculator=MuffleCalculator()
print calculator.calc('10/2')
#print calculator.calc('10/0') # No muffling
#5
#Traceback (most recent call last):
# File "tta.py", line 14, in <module>
# print calculator.calc('10/0') # No muffling
# File "tta.py", line 5, in calc
# return eval(expr)
# 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:
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!"
except TypeError:
print "That wasn't a number, was it?"
#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 are bogus...'
#8.6 捕捉对象
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
print x/y
except (ZeroDivisionError, TypeError, NameError), e:
print e
#在Python 3.0 中, except子句会被写作 except (ZeroDivisionError, TypeError, NameError) as e
#8.7 真正的全捕捉
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
print x/y
except:
print 'Something wrong happened...'
>>> x=input('Enter the first number: ')
Enter the first number: 10
>>> y=input('Enter the second number: ')
Enter the second number: 0
>>> print x/y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
#8.8 万事大吉
>>> try:
... print 'A simple task'
... except:
... print 'What? Something went wrong?'
... else:
... print 'Ah... It went as planned.'
...
A simple task
Ah... It went as planned.
#只要有错误发生, 程序会不断要求重新输入
while True:
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
value = x/y
print 'x/y is', value
except:
print 'Invalid input. Please try again.'
else:
break
#python ttb.py
#Enter the first number: 1
#Enter the second number: 0
#Invalid input. Please try again.
#Enter the first number: 'foo'
#Enter the second number: 'bar'
#Invalid input. Please try again.
#Enter the first number: baz
#Invalid input. Please try again.
#Enter the first number: 10
#Enter the second number: 2
#x/y is 5
#打印更加有用的错误信息:
while True:
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
value = x/y
print 'x/y is', value
except Exception, e:
print 'Invalid input:', e
print 'Please try again'
else:
break
#python ttc.py
#Enter the first number: 1
#Enter the second number: 0
#Invalid input: integer division or modulo by zero
#Please try again
#Enter the first number: 'x'
#Enter the second number: 'y'
#Invalid input: unsupported operand type(s) for /: 'str' and 'str'
#Please try again
#Enter the first number: quuux
#Invalid input: name 'quuux' is not defined
#Please try again
#Enter the first number: 10
#Enter the second number: 2
#x/y is 5
#8.8 最后
>>> x=None
>>> try:
... x = 1/0
... finally:
... print 'Cleaning up...'
... del x
...
Cleaning up...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero
>>>
>>> try:
... 1/0
... except NameError:
... print 'Unknown variable'
... else:
... print 'That went well!'
... finally:
... print 'Cleaning up.'
...
Cleaning up.
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero
#异常和函数
>>> def faulty():
... raise Exception('Someting is wrong')
...
>>> def ignore_exception():
... faulty()
...
>>> def handle_exception():
... try:
... faulty()
... except:
... print 'Exception handled'
...
>>>
>>> ignore_exception()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in ignore_exception
File "<stdin>", line 2, in faulty
Exception: Something is wrong
>>>
>>> handle_exception()
Exception handled
>>>
#8.11 异常之禅
>>> def describePerson(person):
... print 'Description of', person['name']
... print 'Age:', person['age']
... if 'occupation' in person:
... print 'Occupation:', person['occupation']
...
def describePerson(person):
print 'Description of', person['name']
print 'Age:', person['age']
try:
print 'Occupation: ' + person['occupation']
except KeyError: pass
person = {'name':'Jonathan', 'age':33}
describePerson(person)
#python ttd.py
#Description of Jonathan
#Age: 33
person = {'name':'Jonathan', 'age':33, 'occupation':'IBIT Support'}
describePerson(person)
#python ttd.py
#Description of Jonathan
#Age: 33
#Occupation: IBIT Support
#8.12 小结
# 异常对象
# 引发异常
# 自定义异常类
# 捕捉异常: 使用try语句的except子句捕捉异常. 如果在except子句中不特别指定异常类, 那么所有的异常都会被捕捉.
# 异常可以放在 元组 中以实现多个异常的指定.
# 如果给except提供两个参数, 第二个参数就会绑定到 异常对象 上
# 在一个try语句中,可以包含多个except子句, 用来分别处理不同的异常
#else子句 如果主块try中没有发生异常, else子句就会被执行
#finally子句-- 如果需要确保某些代码不管是否有异常引发都要执行(比如清理代码, 关闭文件, 关闭网络套接字, 关闭数据库连接),
# 那么这些代码可以放置在finally子句中
#异常和函数 在函数内引发异常时, 它就会被传播到函数调用的地方(对于方法也是一样)
#8.12.1 新函数
# warnings.filterwarning(action....) 用于过滤警告
#Exception 所有异常的基类
#AttributeError 特性引用或赋值失败时引发
#IOError 试图打开不存在的文件(包括其他情况)时引发
#IndexError 在使用序列中不存在的索引时引发
#KeyError 在使用映射中不存在的键时引发
#NameError 在找不到名字(变量)时引发
#SyntaxError 在代码为错误形式时引发
#TypeError 在内建操作或函数应用于错误类型的对象时引发
#ValueError 在内建操作或函数应用于正确类型的对象,但该对象使用不合适的值时引发
#ZeroDivisionError 在除法或模除操作的第二个参数为0时引发
分享到:
相关推荐
第8章 异常 第9章 魔法方法、属性和迭代器 第10章 充电时刻 第11章 文件和素材 第12章 图形用户界面 第13章 数据库支持 第14章 网络编程 第15章 Python和万维网 第16章 测试 第17章 扩展Python 第18章 ...
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
python基础教程至60课(基础) 【Python 第1课】安装 6 【Python 第2课】print 7 【Python 第3课】IDE 10 【Python 第4课】输入 12 【Python 第5课】变量 14 【Python 第6课】bool 16 【Python 第7课】if 19 【Python...
【课程列表】 Python基础入门教程 由浅入深讲解清晰 第1章 ...Python基础入门教程 由浅入深讲解清晰 第8章 异常处理结构与程序调试 (共44页).ppt Python基础入门教程 由浅入深讲解清晰 第9章 GUI编程 (共43页).ppt
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
【课程列表】 Python基础入门教程 由浅入深讲解清晰 第1章 ...Python基础入门教程 由浅入深讲解清晰 第8章 异常处理结构与程序调试 (共44页).ppt Python基础入门教程 由浅入深讲解清晰 第9章 GUI编程 (共43页).ppt
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
【课程列表】 Python基础入门教程 由浅入深讲解清晰 第1章 ...Python基础入门教程 由浅入深讲解清晰 第8章 异常处理结构与程序调试 (共44页).ppt Python基础入门教程 由浅入深讲解清晰 第9章 GUI编程 (共43页).ppt
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
第8章 Python类和对象.pptx 第9章 Python异常.pptx 第10章 Python文件操作.pptx 第11章 Python项目实战:爬虫程序.pptx 第12章 Python项目实战:数据可视化.pptx 第13章 Python项目实战:数据分析.pptx
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...
Python从入门到精通 第8章 Python中使用正则表达式.ppt Python从入门到精通 第9章 函数.ppt Python从入门到精通 第10章 面向对象程序设计.ppt Python从入门到精通 第11章 模块.ppt Python从入门到精通 第12章 异常...
【课程列表】 Python基础入门教程 由浅入深讲解清晰 第1章 ...Python基础入门教程 由浅入深讲解清晰 第8章 异常处理结构与程序调试 (共44页).ppt Python基础入门教程 由浅入深讲解清晰 第9章 GUI编程 (共43页).ppt
Python基础入门教程 Python语言编程导论08 第八章 面向对象编程 (共114页).ppt Python基础入门教程 Python语言编程导论09 第九章 异常处理与程序调试 (共56页).ppt Python基础入门教程 Python语言编程导论10 ...