Python基础教程 第八章 异常

2017年11月18日13:24:00
  • Python基础教程 第八章 异常已关闭评论
  • 433 views
  • A+
所属分类:Python基础

8.2.1 raise语句

>>>raise Exception

>>>raise ArithmeticError

 

内建的异常类有很多。Python库参考手册的“Built-in Exceptions"

 

 

这些内建异常都可以在exceptions模块

 

可以使用dir函数列出模块的内容

import exceptions
print dir(exceptions)

 

表8-1一些内建异常

类名描述

Exception 所有异常的基类

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

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

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

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

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

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

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

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

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

 

8.2.2 自定义异常类

class SomeCustomException(Exception):pass

 

8.3捕捉异常

这个功能可以使用try/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!"

 

输出

Enter the first number:2

Enter the second number:0

The second number can't be zero!

 

8.4 不止一个except子句

8.5用一个块捕捉两个异常

 

try:
x=input('Enter the first number:')
y=input('Enter the second number:')
print x/y
except ZeroDivisionError,TypeError:
print "The second number can't be zero!

except Exception:
print "The second number can't be zero!

 

 

 

8.6捕捉对象

如果希望在except子句中访问异常对象本身,可以使用两个参数(注意,就算要捕捉到多,

异常,也只需向except子句提供一个参数—‘个元组)。比如,如果想让程序继续运行,但;

又因为某种原因想记录下错误(比如只是打印给用户看),这个功能就很有用。下面的示例程J

会打印异常(如果发生的话),但是程序会继续运行:

try:
x=input('Enter the first number:')
y=input('Enter the second number:')
print x/y
except (ZeroDivisionError,TypeError),e:
print e

注意在Python 3.0中,except子句会被写作except (ZeroaivisionError,TypeError) as e:

 

 

8.7真正的全捕捉

 

try:

x=input('Enter the first number:')
y=input('Enter the second number:')
print x/y

except:

print 'Something'

 

像这样捕捉所有异常是危险的,因为它会隐藏所有程序员未想到并且未做好准备处理的错误

 

 

8.8 else语句

有些情况中,一些坏事发生时执行一段代码是很有用的;可以像对条件和循环语句那样,给try/except语句加个else子句:

try:
print 'A simple task'
except:
print 'What? Something went wrong?'
else:
print 'Ah... It went as planned.'

 

例子2:(如果发生了异常就不会执行退出循环的语句)

while True:
try:
x = input('Enter the first number:')
y = input('Enter the second number:')
print x / y
except:
print '?'
else:
break

 

 

8.9 Finally子句

最后,是Finally子句。它可以用来在可能的异常后进行清理。它和try子句联合使用

x=None

try:

x=1/0

finally:

print 'Cleaning up...

del x

上面的代码中,finally子句肯定会被执行,不管try子句中是否发生异常

 

try:

1/0

except NameError:

print "Unknown variable"

else:

print "That went well!"

finally:

print "Cleaning up.”

 

 

8.10异常和函数

异常和函数能很自然地一起工作。如果异常在函数内引发而不被处理,它就会传播至(浮到)

函数调用的地方。如果在那里也没有处理异常,它就会继续传播,一直到达主程序(全局作用域)。

如果那里没有异常处理程序,程序会带着堆栈跟踪中止。看个例子:

 

 

8.'12小结

本章的主题如下。

口异常对象。异常情况(比如发生错误)可以用异常对象表示。它们可以用几种方法处理,  但是如果忽略的话,程序就会中止。

0警告。警告类似于异常,但是(一般来说)仅仅打印错误信息。

0引发异常。可以使用raise语句引发异常。它接受异常类或者异常实例作为参数。还能提  供两个参数(异常和错误信息)。如果在except子句中不使用参数调用raise,它就会“重  新引发”该子句捕捉到的异常。

 

自定义异常类:用继承Exception类的方法可以创建自己的异常类。

捕捉异常。使用t ry语句的except子句捕捉异常。如果在except子句中不特别指定异常类,

那么所有的异常都会被捕捉。异常可以放在元组中以实现多个异常的指定。如果给except提供两个参数,第2个参数就会绑定到异常对象上。同样,在一个try/except语句中能包含多个except子句,用来分别处理不同的异常。

else子句。除'except子句,可以使用else子句。如果主t ry块中没有引发异常,else子句就会被执行。

finally。如果需要确保某些代码不管是否有异常引发都要执行(比如清理代码),那么这些代码可以放置在finally。子句中。

异常和函数。在函数内引发异常时,它就会被传播到到函数调用的地方(对于方法也是一样

 

 

表8-2本章的新函数

函数描述

warnings.filterwarnings(action,…〕

用于过滤警告

 

 

 

 

 

 

 

 

 

 

 

 

 

 

avatar