@[toc]
1.异常的概念
异常: 程序运行过程中,代码遇到错误,给出错误的提示,比如下面的这两个错误ValueError,ZeroDivisionError
print('其他的代码......')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
a = int(num)
ans = 10 / a
print('计算得到的结果是:', ans)
print('其他的代码......')
ValueError,ZeroDivisionError这两个报错样例代码
ValueError,ZeroDivisionError这两个报错的信息
2.捕获单个异常
异常: 程序代码在运行过程中遇到的错误, 程序会报错,会终止程序代码的运行.
异常捕获: 是指在程序代码运行过程中,遇到错误, 不让程序代码终止,让其继续运行, 同时可以给使用者一个提示信息并记录这个错误, 便于后期改进
try:
可能发生异常的代码
except 异常的类型:
发生异常执行的代码
print('其他的代码......')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:
a = int(num)
ans = 10 / a
print('计算得到的结果是:', ans)
except ZeroDivisionError:
print('你输入有误,请再次输入')
print('其他的代码......')
示例代码
输入0的时候没有出现报红,而是显示的我定义的东西
3.捕获多个异常
3.1第一种方法
try:
可能发生异常的代码
except (异常的类型1, 异常类型2, ...):
发生异常执行的代码
print('其他的代码......')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:
a = int(num)
ans = 10 / a
print('计算得到的结果是:', ans)
except (ZeroDivisionError, ValueError):
print('你输入有误,请再次输入')
print('其他的代码......')
示例代码
3.2第二种方法
try:
可能发生异常的代码
except 异常类型1:
发生异常1,执行的代码
except 异常类型2:
发生异常2,执行的代码
except ...:
pass
print('其他的代码......')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:
a = int(num)
ans = 10 / a
print('计算得到的结果是:', ans)
except ZeroDivisionError:
print('你输入有误,请再次输入')
except ValueError:
print('输入有误,请输入数字')
print('其他的代码......')
示例代码
4.打印异常信息
try:
可能发生异常的代码
except (异常的类型1, 异常类型2, ...) as 变量名:
发生异常执行的代码
print(变量名)
print('其他的代码......')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:
a = int(num)
ans = 10 / a
print('计算得到的结果是:', ans)
except (ZeroDivisionError, ValueError) as e:
print('你输入有误,请再次输入', e)
print('其他的代码......')
示例代码
5.捕获所有的异常
Exception或者BaseException都可以
try:
可能发生异常的代码
except: # 缺点, 不能获取异常的描述信息
发生异常执行的代码
==============
try:
可能发生异常的代码
except Exception as e:
发生异常执行的代码
print(e)
pass
# Exception 是常见异常类的父类,
ZeroDivisionError --> ArithmeticError --> Exception --> BaseException ---> object
ValueError --> Exception --> BaseException ---> object
print('其他的代码......')
num = input('请输入一个数字:')
try:
a = int(num)
ans = 10 / a
print('计算得到的结果是:', ans)
f = open('1.txt', 'r')
except Exception as e:
print('你输入有误,请再次输入', e)
print('其他的代码......')
6.异常的完整结构
try:
可能发生异常的代码
except Exception as e:
发生异常执行的代码
print(e)
else:
代码没有发生异常,会执行
finally:
不管有没有发生异常,都会执行
print('其他的代码......')
num = input('请输入一个数字:')
try:
a = int(num)
ans = 10 / a
print('计算得到的结果是:', ans)
except Exception as e:
print('你输入有误,请再次输入', e)
else:
print('没有发生异常,我会会执行')
finally:
print('不管有没有发生异常,我都会执行')
print('其他的代码......')
7.异常的传递
是 python 异常处理的底层机制,是原理层面上的,不需要我们自己写代码实现,是 python 已经实现好的.
异常传递: 当一行代码发生异常之后,会向外层将这个异常进行传递,指导被捕获或者程序报错为止.
- try 嵌套
- 函数嵌套
print('其他的功能代码.....')
num = input('请输入数字:')
try:
try:
a = int(num) # ValueError
except ZeroDivisionError:
print('发生异常')
finally:
print('我都执行了....')
num = 10 / a
print(f'计算的结果<<{num}>>')
except Exception as e:
print(e)
print('其他的功能代码.....')
def func1():
print('-------1---------')
num = input('请输入数字') # 0
num = 10 / int(num) # 假设0 是计算的出来的
print(num)
print('-------2---------')
def func2():
print('-------3---------')
func1()
print('-------4---------')
try:
print('-------5---------')
func2()
print('-------6---------')
except Exception as e:
print('-------7---------')
print(e)
# 5 3 1 7
8.抛出自定义异常
程序代码为什么会报错?因为不符合语法, 因为 python 的作者在代码中使用了 if 判断,如果除数为 0 ,就会在代码中抛出异常错误,
抛出异常:
raise 异常对象 # 当程序代码遇到 raise 的时候,程序就报错了
异常对象 = 异常类(参数)
抛出自定义异常:
- 自定义异常类,继承 Exception 或者 BaseException
- 选择书写,定义 init__方法,定义__str 方法
- 在合适的时机抛出异常对象即可
# 1. 定义异常类, 密码长度不足的异常
class PasswordLengthError(Exception):
# def __str__(self):
# return 'xxxxxx'
pass
def get_password(): # 等同于系统定义函数
password = input('请输入密码:')
if len(password) >= 8:
print('密码长度合格')
else:
# 抛出异常
raise PasswordLengthError('密码长度不足8位')
# print('密码长度不足8位')
try:
get_password() # 调用系统的函数
except PasswordLengthError as e:
print(e)
print('其他代码.....')