异常的处理
异常是指程序中的例外,违例情况;
在Python3中,BaseException是所以异常的基类,所以的内置异常都是它的派生类;
Exception是除了SystemExit,GeneratorExit和KeyboardInterrupt之外的所有内置异常的基类,用户自定义的异常也要继承它;
Python内的异常使用继承结构创建,可以在异常处理程序中捕获基类异常,也可以捕获子类异常;
*StopItertion
当迭代器中没有数据项时触发,由内置函数next()和迭代器的__next__()方法触发
*ArithmeticError
算法异常基类,包括OverflowError(溢出异常),ZeroDivisionError(零除异常),FloatingPointError(失败的浮点数操作)
*AssertionError
assert语句失败时触发
*AttributeError
属性引用和属性赋值异常
*BufferError
缓存异常,当一个缓存相关的操作不能进行时触发
*EOFError
未见末尾,使用内置函数input()生成,标识到达文件末尾。但是如read()和readline()等大多数I/O操作将返回一个空字符串来表示EOF而不是引发异常
*ImportError
导入异常,当import语句或者from语句无法在模块中找到相应文件名称时触发
*LookupError
当使用映射或者序列时,如果键值或者索引无法找到的时候触发——(KeyError和IndexError的基类)
*MemoryError
内存错误,当操作超出内存范围时触发
*NameError
名称异常,在局部或者全局空间中无法找到文件名称时触发
*OSError
当一个系统函数返回一个系统相关的错误时触发
*ReferenceError
引用异常,当底层的对象呗销毁后访问弱引用是触发
*RuntimeError
包含其他分类中没有被包括进去的一般错误
*SyntaxError
语法错误
*SystemError
编译器的内部错误
*TypeError
类型异常,当操作或者函数应用到不合适的类型时触发
*ValueError
值异常,当操作或者函数的类型正确,但是值不正确时触发
*Warning
警告
try...except
try...except语句用于处理问题语句,捕获可能出现的异常;
try子句中的代码块放置可能出现异常的语句,except子句中的代码块处理异常;
当异常出现时,python会自动生成1个异常对象,包含异常的具体信息;
如:
open("hello.txt","r")
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 1, in <module>
open("hello.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: 'hello.txt'
使用try...except语句:
try:
open("hello.txt","r") #尝试读取一个不存在的文件,如果出现异常直接跳入except
print("读文件")
except FileNotFoundError: #捕捉FileNotFoundError异常
print("文件不存在")
except: #其他异常情况
print("程序异常")
输出结果:
文件不存在
try:
result = 10/0
except ZeroDivisionError:
print("0不能被整除")
else:
print(result)
#如果result表达式为10/2,则异常不会发生,else子句将被执行
try:
s = "hello"
try:
print(s[0] + s[1])
print(s[0] - s[1])
except TypeError:
print("字符串不支持减法运算")
except:
print("异常")
输出结果:
he
字符串不支持减法运算
如果外层try子句中的代码块引发异常,程序直接跳转到外层对应的except子句
try...except嵌套语句通常用于释放已经创建的系统资源
try...finally
无论异常是否发生,finally子句都会被执行;
所有finally子句通常用于关闭因异常而不能释放的系统资源;
try中的变量是局部变量;
try:
f = open("hello.txt","r")
try:
print(f.read(5))
except:
print("读取文件错误")
finally:
print("释放资源")
f.close()
except FileNotFoundError:
print("文件不存在")
输出结果:
文件不存在
使用raise抛出异常
raise可以显示引发异常,一旦执行了raise语句,raise后面的代码将不能被执行;
raise语句通常用于抛出自定义异常,因其不再python的控制范围内,不会被python自动抛出
try:
s = None
if s is None:
print("s是空对象")
raise NameError
print(len(s))
except TypeError:
print("空对象没有长度")
输出结果:
s是空对象
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 5, in <module>
raise NameError
NameError
自定义异常
Python运行程序媛自定义异常类型,用于描述Python异常体系中没有涉及的异常情况;
自定义异常必须继承Exception类,按照命名规范以Error结尾,显示告诉程序媛该类是异常类;
自定义异常使用raise语句引发
from __future__ import division
class DivisionException(Exception):
def __init__(self,x,y):
Exception.__init__(self,x,y)
self.x = x
self.y = y
if __name__ == "__main__":
try:
x = 3
y = 2
if x%y > 0:
print(x/y)
raise DivisionException(x,y) #注释此行DivisionException异常不会触发
except DivisionException.div: #div表示DivisionException类的实例对象
print("DivisionException:x/y = %.2f"%(div.x/div.y))
输出结果:
1.5
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 15, in <module>
raise DivisionException(x,y) #注释此行DivisionException异常不会触发
DivisionException: (3, 2)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 16, in <module>
except DivisionException.div: #div表示DivisionException类的实例对象
AttributeError: type object 'DivisionException' has no attribute 'div'
assert语句
assert语句用于检测某个表达式是否为真;
又称断言语言,即assert认为检测的表达式永远为真;
t = ("hello",)
assert len(t) >= 1
t = ("hello")
assert len(t) ==1
输出结果:
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 4, in <module>
assert len(t) ==1
AssertionError