1. 什么是异常
Exception(异常):表示程序还可以进行处理的“异常”,可以捕获且可能恢复,更加程序的稳定性、健壮性。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。( 还有能救… (⊙︿⊙))
2. 异常的处理机制
Python 的异常机制主要依赖try 、except 、else、finally 和 raise
五个关键字。
- try 关键字后面缩进的代码块简称 try 块,它里面放置的是
可能引发异常的代码
; - except 关键字对应
异常类型和处理该异常
的代码块; - 多个 except 块之后可以放一个 else 块,表明程序
不出现异常
时还要执行 else 块; - finally 块用于回收在 try 块里打开的物理资源,异常机制会保证
finally 块总被执行
; - raise 用于
引发一个实际的异常
,raise 可以单独作为语句使用,引发一个具体的异常对象;
# Python异常处理机制
try:
需要监测其异常的代码块
except:
当捕捉到 “某一类型的异常(可指定)” 执行此处的代码
else:
没有捕捉到异常,执行此处
finally:
有没有异常都要执行此处
代码示例:
import os
dirname = 'doc'
filename = os.path.join(dirname, 'index.html') # doc/index.html
# try 关键字后缩进的代码块简称 try 块,它里面放置的是可能引发异常的代码;
try:
with open(filename, 'w') as f:
f.write('hello')
# except 关键字对应异常类型和处理该异常的代码块;
except FileNotFoundError as e:
os.mkdir(dirname)
# 如何没有产生任何异常时, 执行的内容
else:
print('no exception')
# finally 块用于回收在 try 块里打开的物理资源,异常机制会保证 finally 块总被执行
finally:
print("不管是否有异常都要执行的代码")
ps:如果try 代码块中同时存在多个异常,一旦第一个引发的异常被except成功捕捉后,try 代码块中后续的代码不再执行,及时后续代码中存在可以捕获的异常。代码示例如下:
try:
print(10/0) # ZeroDivisionError, 异常已发之后, 异常后面的代码不会继续执行。
print(a) # NameError,上面的异常一旦引发,此句不在执行
except ZeroDivisionError as e:
print('zero')
except NameError as e:
print('name')
else:
print('ok')
print('TO BE CONTINUE')
执行结果:
3. 触发及自定义异常
Python 允许程序自行引发异常,自行引发异常
使用 raise 语句来完成。
raise语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
raise[Exception[, args[, traceback]]]
用户自定义异常
都应该继承 Exception 基类或 Exception 的子类,在自定义异常类时基本不需要书写更多的代码,只要指定自定义异常类的父类即可。
class AgeError(ValueError): # 自定义异常,一般继承某一类异常,即一个Exception的子类
pass
age = 1000
if 0 < age < 150:
print('age legal')
else:
raise AgeError('age error') # 引发自定义的异常
执行结果:
【注意】异常的层级关系
4. Python中异常的使用规范
- 不要过度使用异常
- 不要使用过于庞大的 try 块
- 不要忽略捕获到的异常