Python学习第十天
异常
程序执行过程中出现的各种各样的错误。
语法
-
try :需要处理异常的代码块
-
except: 异常名称1 as 异常别名1:异常1处理 补偿或者回滚处理
-
else:try代码块中正确执行后执行的代码 可以将下一步写到这里(可以有else也可以没有)
-
finally:无论是否报异常都要执行最后的代码,资源的释放、最终要执行的代码或者其他部分
list = [1,2,3]
try:
# 为list[3]是IndexError
list[2]
except IndexError as e:
# 捕获错误
print('index error:',e)
except TypeError as e:
# 类型错误
print('TypeError error:', e)
else:
# 只有try中正确执行了 才会执行
print('else code block')
finally:
# 最终都要执行
print('finally code block')
常见异常
不知道的保存后续来查看下就行了,或者不知道也就可以写他们的基类
异常名称 | 基类 | 描述 |
---|---|---|
BaseException | - | 所有内置异常的基类,通常不直接捕获。 |
Exception | BaseException | 所有内置、非系统退出异常的基类,用户自定义异常通常继承此类。 |
IndexError | Exception | 当序列下标超出范围时引发(如列表、元组、字符串)。 |
AttributeError | Exception | 当对象没有指定属性时引发(如访问不存在的属性)。 |
ImportError | Exception | 当导入模块或模块中的对象失败时引发。 |
KeyError | Exception | 当字典中不存在指定的键时引发。 |
TypeError | Exception | 当操作或函数应用于不适当类型的对象时引发(如对整数和字符串相加)。 |
KeyboardInterrupt | BaseException | 当用户按下中断键(如 Ctrl+C )时引发。 |
MemoryError | Exception | 当内存不足时引发。 |
NameError | Exception | 当尝试访问未定义的变量或名称时引发。 |
OSError | Exception | 操作系统相关错误(如文件未找到、权限不足)。 |
StopIteration | Exception | 当迭代器没有更多值可返回时引发。 |
IndentationError | Exception | 当代码缩进不正确时引发。 |
TabError | IndentationError | 当代码中混用了 Tab 和空格时引发。 |
SyntaxError | Exception | 当代码语法错误时引发。 |
ValueError | Exception | 当函数接收到正确类型但值不合适的参数时引发(如 int("abc") )。 |
ZeroDivisionError | Exception | 当除数为零时引发。 |
UnicodeError | ValueError | 与 Unicode 相关的编码或解码错误。 |
RuntimeError | Exception | 当检测到不明确的错误时引发,通常是程序逻辑错误。 |
AssertionError | Exception | 当 assert 语句失败时引发。 |
异常抛出
主动抛出异常信息(类似java中的throw new Exception),可以抛出业务性的异常信息。
语法:
-
raise Exception('业务信息')
-
Python3中,你可以使用
raise from
来保留原始异常的上下文信息raise Exception('抛出的异常') from e
# 主动抛出异常
# 比如登录
username = input("请输入用户名: ")
password = input("请输入密码: ")
try:
# 判断 连接数据库查询 用户名,密码是否正确
if username != 'admin':
raise Exception("用户名不正确,请输入正确用户名")
if password != '123456':
raise Exception("密码不正确,请输入正确密码")
except Exception as e:
print('Exception error:', e)
# python3 中的 raise 异常('要抛出的业务异常') from e
try:
result = 10 / 0
except ZeroDivisionError as e:
raise ValueError("除数不能为0啊") from e
自定义异常
-
必须得继承自Exception或BaseException
-
成员信息可以自行定义,命名要按照...Error的格式进行命名。
-
一般在格式为__init__(self,message='',code='')中处理对应的异常信息
# 后续可能会封装一个 类似于Business的业务异常
class UserLoginError(Exception):
def __init__(self, code=1000):
self.code = code
if code == 1000:
message = '用户名不正确,请输入正确用户名'
else:
message = '密码不正确,请输入正确密码'
super().__init__(message)
# 主动抛出异常
# 比如登录
username = input("请输入用户名: ")
password = input("请输入密码: ")
try:
# 判断 连接数据库查询 用户名,密码是否正确
if username != 'admin':
raise UserLoginError(1000)
if password != '123456':
raise UserLoginError(1001)
except UserLoginError as e:
print(e)