释放双眼,带上耳机,听听看~!

异常处理

我们是人,不是神,所以我们都会犯错。当然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))