python基础
异常
了解异常
当我们执行了不合规的语法时就会抛出异常,比如:
if __name__ == '__main__':
print(1/0)

image.png
如果代码中的某条语句发生异常,在没有捕获处理的情况下,程序就会终止。但是我们正式开发时一定不想这样的情况发生,所以需要捕获可能出现的异常,并在异常发生时去处理它,不影响程序的执行
捕获异常的语法
try:
可能发生异常的代码块
except 异常类型【可选,如果不写则捕获最高级别异常,默认为Exception】:
异常处理的代码块
else:
如果没有发生异常执行的代码块
finally:
无论是否发生异常都要执行的代码块
如果执行发生异常的异常类型和捕获异常时指定的异常类型不同,或者捕获异常时指定的异常不是执行发生异常的异常类型的父异常则不会捕获异常
如果是捕获多种异常,以元组的方式书写
直接打印可以获取到捕获到异常的异常信息
例如:
if __name__ == '__main__':
try:
print(1/0)
except ZeroDivisionError as e:
'''
获取报错信息
'''
print(e) # division by zero
完整例子:
'''
1. 尝试只读⽅方式打开test.txt⽂文件,如果⽂文件存在则读取⽂文件内容,⽂文件不不存在则提示⽤用户即可。
2. 读取内容要求:尝试循环读取内容,读取过程中如果检测到⽤用户意外终⽌止程序,则 except 捕获异常 并提示⽤用户。
'''
try:
f = open('test.txt','r')
try:
while True:
line = f.readline()
time.sleep(2)
print(line,end='')
if not line:
break
except:
print('意外终止')
finally:
f.close()
print('关闭文件')
except:
print('文件不存在,无法读取')
文件内容:
啊哈
果冻呀
冻冻呀
果子冻
宝
儿砸
宝宝呀
在执行过程中点了终止运行后控制台的打印结果:

image.png
常见的异常种类
| 异常名称 | 描述 |
|---|---|
| NameError | 未声明或者初始化对象 |
| ZeroDivisionError | 0做除数异常,0不能做除数例如1/0 |
| IndentationError | 锁进错误 |
| AttributeError | 对象没有这个属性 |
| KeyboardInterrupt | 用户中断执行 |
| StopIteration | 迭代器没有下一个元素 |
| TypeError | 无效操作 |
| IndexError | 索引越界 |
| KeyError | 映射对象中没有这个键 |
| SyntaxError | 编译错误或语法错误 |
例子:
'''
NameError
'''
# print(a) # NameError: name 'a' is not defined
'''
ZeroDivisionError
'''
# print(1/0) # ZeroDivisionError: division by zero
'''
IndentationError
'''
# print(1) # IndentationError: unindent does not match any outer indentation level
'''
AttributeError
'''
# dic = {'name':'zhangsan'}
# print(dic.age) # AttributeError: 'dict' object has no attribute 'age'
'''
KeyboardInterrupt
'''
# print('halou')
# time.sleep(5) # 执行到这里时我停止了程序执行,KeyboardInterrupt
# print('zhene')
'''
StopIteration
'''
# itr = iter([1])
# print(next(itr)) # 1
# print(next(itr)) # StopIteration
'''
TypeError
'''
# print(1/'2') # TypeError: unsupported operand type(s) for /: 'int' and 'str'
'''
IndexError
'''
# lis = [1,2,3]
# print(lis[3]) # IndexError: list index out of range
'''
KeyError
'''
# dic = {'name':'zhangsan'}
# print(dic.pop('age')) # KeyError: 'age'
'''
SyntaxError
'''
# a = , # SyntaxError: invalid syntax
自定义异常
语法为:自己定义一个异常类对象,在需要拋异常的地方通过raise 异常类对象抛出自定义异常
例子:
类定义部分:
'''
密码校验的自定义异常类
如果密码必须是六位,不是纯数字则报异常
'''
class PasswordCheck(Exception):
def __init__(self,password):
self.len = len(password)
self.password = password
def __str__(self):
if self.len != 6:
return '密码必须为6位'
else:
if not self.password.isdigit():
return '密码必须为数字,不得含有其他字符'
调用部分:
from 博客练习.tmp import PasswordCheck
if __name__ == '__main__':
try:
password = input('请输入密码:')
if len(password) != 6 or (not password.isdigit()):
raise PasswordCheck(password)
except Exception as e:
print(e)
else:
print('密码输入成功')
'''
请输入密码:123
密码必须为6位
____________
请输入密码:guodong1
密码必须为6位
___________
请输入密码:gd1234
密码必须为数字,不得含有其他字符
___________
请输入密码:123456
密码输入成功
'''