- 异常概述
- 异常捕获与处理
- try-except语句
- 案例一:实现程序异常捕获
- 使用as获取异常信息
- 案例二:使用as 语句返回捕获的异常
- try-except-else语句
- 案例三:异常捕获时else语句的使用
- try-finally语句
- 案例四:异常捕获时finally语句的使用
- 触发异常
- raise语句
- assert语句
- 自定义异常
- 案例五:自定义一个只能取正数的类
异常是指程序运行时引发的错误,引发错误的原因有很多,如语法错误、逻辑错误等,若这些错误没有进行处理,将会导致程序终止运行
在程序中,当python检测到一个错误时,解释器就会指出当前的流程无法继续执行下去,同时会给出错误的相关提示,如下面的例子:
上面的提示信息告诉我们字符串和整数不能相加,其中的TypeError是python内置的异常类,像这样的异常类python中还有很多
异常类
| 异常类 | 描述 |
|---|---|
| Exception | 所有异常的基类 |
| ZeroDivisionError | 除数为0 |
| TypeError | 传入对象类型不合要求 |
| NameError | 变量未声明 |
| IndexError | 索引超出序列范围 |
| KeyError | 请求一个不存在的字典关键字 |
| ValueError | 传入给函数的参数类型不正确 |
| AttributeError | 尝试访问未知的对象属性 |
为了防止程序运行遇到异常而意外终止,开发时应对可能出现的异常进行捕获并处理,
try-except语句语法格式:
try: 可能出现异常的语句 except 异常类名: 处理异常的语句 except 异常类名: 处理异常的语句 except ... ...
当try下面的某条语句出现错误程序就直接跳转至except语句,下面看一个程序举例
案例一:实现程序异常捕获try:
choice=''
while choice!='f':
a=int(input('请输入一个整数:'))
b=int(input('请输入另外一个整数:'))
print('a/b整数相除的结果是:',a/b)
choice=input('是否继续进行:(是y否f):')
except ZeroDivisionError:
print('除数不能为零!')
except ValueError:
print('输入的参数无效')
运行结果
从上面的程序中我们可以看出,程序并没有执行try下面的print语句,因为程序捕获了一个除数为0的错误并进行了处理,所以程序能够正常结束
使用as获取异常信息as语句将捕获的异常类转化为一个异常对象,通过异常对象名便可以访问异常信息
单一异常类信息
语法格式
try: 可能出现异常的语句 except 异常类名 as 异常对象名: 处理异常的语句
多种异常类信息
语法格式:
try: 可能出现的异常类 except (异常类名1,,异常类名2,..) as 异常对象名: 处理异常的语句案例二:使用as 语句返回捕获的异常
try:
choice=''
while choice!='f':
a=int(input('请输入一个整数:'))
b=int(input('请输入另外一个整数:'))
print('a/b整数相除的结果是:',a/b)
choice=input('是否继续进行:(是y否f):')
except (ZeroDivisionError,ValueError) as e:
print(type(e),e)
运行结果
常用于处理未捕获到异常的情形,捕获异常成功时,else语句并不被执行
:
语法格式:
try: 可能出现异常的语句 except 异常类名 as 异常对象名: 捕获异常后的处理异常的语句 else: 未捕获到异常执行的语句案例三:异常捕获时else语句的使用
try:
a=int(input('请输入一个整数:'))
b=int(input('请输入另外一个整数:'))
c=a/b
except baseException as e:
print('请检查输入的数据是否合法',e)
else:
print('程序执行结果为:',c)
运行结果
无论try语句中是否发生异常,finally语句块都会执行,常用于清理在try语句中执行的操作,如释放其占用的内存等
语法格式:
try: 可能出现异常的语句 finally: 其他语句案例四:异常捕获时finally语句的使用
try:
file1=open('123.txt')
line=file1.readline()
print(line)
finally:
file1.close()
触发异常
触发异常有两种情况:
- 程序执行中因为错误自动触发异常
- 显式使用raise或assert语句手动触发异常
-
通过类名触发异常
只需要指明异常类便可以创建异常类的实例对象并触发异常
语法格式:raise 异常类名
-
通过了实例对象触发异常
只需要指明异常类的实例对象便可触发异常
语法格式:raise 异常类的实例对象('指定异常信息')
assert语句又称为断言语句,主要用于在程序中表达某个对象的某种判断条件
语法格式:assert 表达式 [,参数]
表达式为真时,不触发异常,表达式为假,触发AssertError异常,可选参数可以作为异常信息的一部分抛出
python内置的异常类毕竟有限,用于可以根据需求设置其它异常
案例五:自定义一个只能取正数的类class NumberError(Exception): # 继承父类
def __init__(self,data):
super().__init__(self,data) # 继承父类构造方法并添加一个参数
self.data=data
def __str__(self):
return self.__class__.__name__+':'+self.data+'非法数值(负数)' # __class__表示当前操作的对象的类,
try:
num=input('请输入一个正数:')
if int(num)<=0:
raise NumberError(num)
print('输入的正数为:',num)
except baseException as e:
print(e)
运行结果



