python异常
异常
异常的介绍
1) 程序在运行的时候, 如果Python解释器遇到一个错误, 就会停止程序的运行, 并且提示一些错误信息, 这个就是异常
2) 程序停止执行并且提示错误这个动作, 被称之为: 抛出异常(raise)
3) 抛出异常的格式: 异常类型+描述错误信息
例子:ZeroDivisionError: division by zero
捕获异常
概念
1) 程序代码在执行的时候, 如果遇到异常, 程序就会终止, 不会继续执行
2) 需求: 程序遇到异常后, 不会结束, 可以继续执行
3) 实现: 使用异常捕获
1. 基本语法
try:
可能发生异常的代码
except : # 可以捕获任意类型的异常
发生了异常的代码
代码:
# 1. 获取⽤户从键盘输⼊的数据
num = input('请输⼊数字:')
try:# 2. 转换数据类型为整数num = int(num)# 3. 数据转换类型正确时, 输出数据内容print(num)
except:# 4. 数据转换类型错误时, 提示输⼊正确数据print('请输⼊正确的数字')
2. 捕获指定类型的异常
异常的类型很多,针对不同的异常,处理方式不一样
try:
可能发生异常的代码
except 异常类型1:
发生异常类型1, 执行的代码
except 异常类型2:
发生异常类型2, 执行的代码
except ...:
pass
# 关于发生异常的类型, 可以从报错信息里面获取
代码:
try:num = int(input('请输⼊⼀个整数数字:'))num1 = 8 / numprint(num1)
except ValueError: #print('输⼊的内容⾮数字,请重新输⼊')
except ZeroDivisionError:print('不能输出数字 0, 请重新输⼊')
3. 捕获未知类型的异常
处理未知异常, 我们可以直接就使用 Exception, 它是所有异常的父类
try:
可能发生异常的代码
except Exception as 变量: #变量 可以打印出来, 内容时异常的信息
代码:
try:num = int(input('请输⼊⼀个整数数字:'))num1 = 8 / numprint(num1)
except Exception as e:print(f'发⽣了异常, {e}')
4. 异常捕获的完整结构
一般处理异常的流程
try:
可能发生异常的代码
except 异常类型:
发生了指定异常执行的代码
exception Exception as e
发生了其他类型异常执行的代码
else:
没有发生异常,会执行的代码
finally:
不管有没有发生异常, 都会执行的代码
案例:
需求
1. 获取⽤户输⼊的数字
2. 判断获取的数字是否整数
3. 如果不是整数, 提示输⼊错误
4. 如果是整数, 则进⼀步判断是奇数还是偶数
5. 最终提示: 程序运⾏结束
方法一: 异常捕获
# 1. 获取⽤户输⼊的数字
num = input('请输⼊数字:')
try:# 2. 判断获取的数字是否整数num = int(num) # 没有发⽣异常, 说明是整数,如果发⽣异常,说明不是整数
except Exception as e:# 3. 如果不是整数, 提示输⼊错误print("输⼊错误", e)
else:# 4. 如果是整数, 则进⼀步判断是奇数还是偶数if num % 2 == 0:print('偶数')else:print('奇数')# 5. 最终提示: 程序运⾏结束
finally:print('程序运⾏结束')
方式二: 直接使用if判断,字符串.isdigit() 判断数字是否是纯数字,是 纯数字,返回True,不是返回 False
# 1. 获取⽤户输⼊的数字
num = input('请输⼊数字:')
# 2. 判断获取的数字是否整数
if num.isdigit():# 如果是 True, 表示是整数# 类型转换num = int(num)# 4. 如果是整数, 则进⼀步判断是奇数还是偶数if num % 2 == 0:print('偶数')else:print('奇数')
# 3. 如果不是整数, 提示输⼊错误
else:print('输⼊错误')
# 5. 最终提示: 程序运⾏结束
print('程序运⾏结束')
异常传递
异常传递 是Python 一种处理异常的方式, 是指在函数的嵌套调用中, 如果发生了异常, 没有解决, 就会把这个异常传递到函数调用的地方(往上抛), 直到被捕获为止, 如果一直没有捕获, 才会报错, 终止执行
代码:
def test():a = 1 / 0return adef test1():print(test())if __name__ == '__main__':test1()
我们一般在最后的主函数进行异常的捕获
def test():a = 1 / 0return adef test1():print(test())if __name__ == '__main__':try:test1()except Exception as e:print("有异常")
抛出异常
基本意思就是, 我们可以手动创建一个异常, 按照我们自己指定的规则, 如果违反了规则, 就手动抛出异常(根据 应用程序 特有的业务需求 主动抛出异常)
1) 在执行代码的过程中, 之所以会出现异常, 终止代码执行, 是因为 代码执行遇到了 raise 关键字
2) raise 关键字的作用: 抛出异常, 让代码终止
3) 应⽤场景: ⾃⼰书写代码模块,让别⼈使⽤,为了让别⼈按照你的规定使⽤你的代码,你就可以在他不满⾜你条件的情况下,使⽤raise 抛出异常
案例:
1. 定义 input_password 函数,提示用户输入密码
2. 如果用户输入长度 < 8,抛出异常
3. 如果用户输入长度 >=8,返回输入的密码
代码:
def input_password():# 1. 输入用户密码pwd = input("请输入用户名密码: ")# 2. 判断密码长度, 如果密码长度 > 8, 返回密码if len(pwd) > 8:print("密码: ".format(pwd))# 3. 长度不够抛出异常else:raise Exception("长度不够,抛出异常")if __name__ == '__main__':input_password()