释放双眼,带上耳机,听听看~!
异常处理
我们是人,不是神,所以我们都会犯错。当然python也不例外,当python犯错时,可不会道歉哦,还会给你一个异常警告。下面我们来简单说一下常见的异常:
AssertionError :断言(assert)语句失败
当assert 后面条件为假时,抛出AssertionError异常。
>>> my_list = ['lss是帅哥']
>>> assert len(my_list) > 0
>>> my_list.pop()
'lss是帅哥'
>>> assert len(my_list) > 0
AssertionError
AttributeError:尝试访问位置的对象属性
当试图访问不存在的对象属性,就是抛出AttributeError异常。
>>> my_list.SB()
AttributeError: 'list' object has no attribute 'SB'
IndexError:索引超出序列范围
当访问一个序列出现IndexError异常时,说明已经超出了索引范围。
>>> my_list = [1,2,3,4,5]
>>> my_list[6]
IndexError: list index out of range
keyError:字典中查找一个不存在的关键字
当试图在字典中查找一个不存在的关键字时,就会引发KeyError异常,因此建议用dict.get()方法。
>>> my_dict = {'one':1,'two':2,'three':3}
>>> my_dict['one']
1
>>> my_dict['four']
KeyError: 'four'
NameError:尝试访问一个不存在的变量
当你尝试访问一个不存在的变量,就会抛出NameError异常。
>>> suiyidebianliang
NameError: name 'suiyidebianliang' is not defined
OSError:操作系统产生的异常
OSError异常顾名思义就是操作系统产生的的异常,像打开一个不存在的文件就会引发FileFoundError异常,这个异常就是OSError的子类。
>>> f = open('不存在的文件.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: '不存在的文件.txt'
SyntaxError:python的语法错误
如果遇到SyntaxrError异常,是python的语法错误,这是你应该修改你的代码咯。
>>> print '这是一个语法错误'
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('这是一个语法错误')?
TypeError:不同类型的无效操作
有些类型不同是不能相互进行计算的,否者就会抛出TypeError异常。
>>> 1 + '1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
ZeroDivisionError:除数为0
我们都知道除数不能为0,当然python也知道啦,所以当除数为0,python会给出ZeroDivisionrError异常。
>>> 5 // 0
ZeroDivisionError: integer division or modulo by zero
还有很多异常就不一一介绍了,详情可查看
我们现在知道程序抛出异常说明这个程序有问题,所以我们可以通过这些捕获异常,并修改这些错误。那我们该如何来捕获这些错误呢?
异常捕获可以通过try语句来实现,任何出现在try语句范围内的异常都会被及时捕获到。try语句有两种实现方式:一种是try-except,另一种是try-finally。
try-except语句
基本语法
try:
检测范围
except ExceptionError[as reason]:
出现异常(Exception)后的处理
针对不同一场设置多个expect
一个try语句可以和多个except语句使用,分别对不同的异常给出相应的处理(按照先子类后父类的顺序)。,并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加BaseException。
try:
sum = 1 + '1'
f = open('我为什么是一个文件.txt','r')
print(f.read())
f.close()
except OSError as reason:
print('文件出错啦!\n错误的原因是'+ str(reason))
except TypeError as reason:
print('类型出错啦!\n错误的原因是'+ str(reason))
except BaseException as reason:
print(reason)
#输出结果
类型出错啦!
错误的原因是unsupported operand type(s) for +: 'int' and 'str'
对多个异常统一处理
except后面可以跟多个一异常,然后对这些异常进行统一的处理。
try:
sum = 1 + '1'
f = open('我为什么是一个文件.txt','r')
print(f.read())
f.close()
except (OSError,TypeError): #多个异常
print('出错啦!')
#输出结果
出错啦!
捕获所有异常
我们有时知道发生了什么异常,可以一下捕获所有异常,如下代码。但是不推荐这样哦!这样使我们不能了解异常的类型,增加bug。
try:
sum = 1 + '1'
f = open('我为什么是一个文件.txt','r')
print(f.read())
f.close()
except:
print('文件出错啦!')
#输出
出错啦!
try-except-finally语句
基本语法
try:
检测范围
except ExceptionError[as reason]:
出现异常(Exception)后的处理
finally:
无论如何都会执行的代码
举个栗子
try:
f = open('我为什么是一个文件.txt','r') #假设这个文件存在
print(f.write('这是一个存在的文件'))
sum = 1 + '1'
f.close() # ①
except:
print('文件出错啦!')
我们不能把f.close()放在①的位置,因为文件打开后,sum=1 + ’1‘就会遇到TypeError异常,程序不能继续执行,那么文件就不会保存起来。所以我们应该把f.close()放在finally下即可。
try:
f = open('我为什么是一个文件.txt','r') #假设这个文件存在
print(f.write('这是一个存在的文件'))
sum = 1 + '1'
#第一:f.close()
except:
print('文件出错啦!')
finally:
f.close()
引发异常小技巧:我们可以自己引发一个异常,那就是raise语句。
>>> raise TypeError
TypeError
>>> raise TypeError('类型不同啊!') #带参数的
TypeError: 类型不同啊!
自定义异常
程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承Exception 或其子类即可。命名一般以Error、Exception 为后缀。
自定义异常由raise 语句主动抛出。
【示例】自定义异常类和raise 语句
#coding=utf-8
#测试自定义异常类
class AgeError(Exception): #继承Exception
def __init__(self,errorInfo):
Exception.__init__(self)
self.errorInfo = errorInfo
def __str__(self):
return str(self.errorInfo)+",年龄错误!在1-150 之间"
############测试代码################
if __name__ == "__main__": #如果为True,则模块是作为独立文件运行,可以执行测试代码
age = int(input("输入一个年龄:"))
if age<1 or age>150:
raise AgeError(age)
else:
print("正常的年龄:",age)
运行结果:
输入一个年龄:200
raise AgeError(age)
__main__.AgeError: 200,年龄错误!应该在1-150 之间
扩展:
try-except-else连用
try:
int('')
except ValueError as reason:
print('出错啦:'+str(reason))
else:
print('没有任何异常')
#输出结果
没有任何异常
with语句与文件的连用
try:
with open('data.txt','w') as f:
for each_line in f:
print(each_line)
except OSError as reason:
print('出错啦:'+str(reason))