Python的异常处理能力是很强大的,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。所有异常都从基类Exception继承,而且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。一旦引发而且没有捕捉SystemExit异常,程序执行就会终止。如果交互式会话遇到一个未被捕捉的SystemExit异常,会话就会终止。
Python 异常处理方式一:try-except
我们试图打开一个不存在的文件aa.txt
open('aa.txt')
程序会Traceback,终止执行
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
f = open('aa.txt')
FileNotFoundError: [Errno 2] No such file or directory: 'aa.txt'
我们会用try-except块来包含可能会抛出异常的代码段,进行异常捕捉处理
try:
f = open('aa.txt')
except FileNotFoundError as e:
print('文件不存在')
执行结果:except块中的代码会被执行
文件不存在
finally块: 如果try块中的代码捕捉到异常,程序会跳转到except块中,try块中剩余的代码遍不在执行。如果没有捕捉到异常,try块中的代码可以完全执行。finally块中的代码,无论有没有捕捉到异常都会被执行
if __name__ == '__main__':
try:
open('aa.txt')
except FileNotFoundError as e:
print("文件不存在")
finally:
print('finally ...')
结果一:
文件不存在
finally ...
结果二:
finally ...
try-except-else模块
if __name__ == '__main__':
try:
open('test.txt')
except FileNotFoundError as e:
print("文件不存在")
else:
print("文件存在")
finally:
print('finally ...')
如果try中没有捕捉到异常,会执行else块中的代码。
结果一:
文件存在
finally ...
结果二:
文件不存在
finally ...
我们还可以对异常进行多次捕捉
import sys
if __name__ == '__main__':
lst = [0,1]
hello = 'aa'
try:
open('test.txt')
print(hello) ##变量hello没有定义,会抛出NameError
print(lst[2])##index out of range,抛出IndexError
except FileNotFoundError as e:
print("文件不存在")
except NameError as e:
print(e)
#except IndexError as e:
# print(e)
except:
print("Unexpected error:", sys.exc_info()[0])
如果try中的前两行都没有抛出异常,第三行则会抛出异常,但是在代码中我并没有指定异常类型进行捕捉,程序会执行最后一个except块
aa
Unexpected error: <class 'IndexError'>
Python 异常处理方式二:raise
在一个函数中,我们可能想要抛出一个异常,而不是在这个函数中进行处理
def raise_ex(args):
if args == 'err':
raise NameError('Invalid name is %s' % args)
else:
print('name: %s' % args)
if __name__ == '__main__':
name = input('请输入name:')
try:
f = raise_ex(name)
except NameError as e:
print('函数raise_ex抛出异常: %s' % e)
结果一:
请输入name:aa
name: aa
结果二:
请输入name:err
函数raise_ex抛出异常: Invalid name is err