1.引言
python中异常是一种特殊对象,它是解释器在执行程序过程中,可能会出现一些错误或者意外。为了保障程序运行逻辑的健壮性,或者告知用户出错了,需要一种管理机制,对异常进行捕获处理。
2.异常
2.1.异常分类
在 Python 中,所有异常必须为一个派生自 BaseException
的类的实例 。详细内容我建议你看官方文档:docs.python.org/zh-cn/3.11/...。
下面我们基于分类,做一个小小的归纳:
2.1.1.基类异常(BaseException)
BaseException是所有异常的根类,它的直接子类有:
- SystemExit:由sys.exit()调用引发,用于退出解释器
- KeyboardInterrupt:中断键触发异常
- GeneratorExit:生成器close方法调用触发异常
- Exception:所有内置非系统退出异常基类
2.1.2.内置异常(继承自Exception)
内置异常,都基础自Exception类,非常多!这里列举几个常见的:
- StopIteration:迭代器没有可再迭代元素时触发
- ArithmeticError:算术类异常。比如除数为0,比如数值溢出等
- EOFError:读取文件末尾异常
- RuntimeError:一般运行时异常
- SystemError:解释器内部错误
2.1.3.用户自定义异常
在实际业务项目开发中,我们会需要自定义一些业务类异常,同样继承自Exception就可以。比如:
python
class CustomError(Exception):
def __init__(self, message):
super().__init__(message)
python中,异常的层次结构,你可以参考:docs.python.org/zh-cn/3.11/...
2.2.异常捕获
python在语法层面为异常捕获提供了支持,语法结构如下:
python
try
#可能发生异常代码块
except 异常:
#捕获到异常后善后处理代码块
finally:
#无论是否发生异常都会执行的代码
示例一:捕获特定异常
python
try:
with open("data.txt", "r") as f:
content = f.read()
except FileNotFoundError: # 精确匹配异常类型
print("文件不存在!")
示例二:捕获多异常
python
try:
num = int(input("输入数字: "))
result = 10 / num
except (ValueError, ZeroDivisionError) as e: # 捕获多个异常
print(f"错误类型:{type(e).__name__}, 详情:{e}")
示例三:捕获所有异常
python
try:
risky_operation()
except Exception as e: # 捕获所有继承自 Exception 的异常
print(f"意外错误: {e}")
# 建议记录日志并重新抛出或处理
2.3.自定义异常
python自定义异常,需要继承Exception。像这样:
python
# 自定义异常,继承Exception
class InvalidAgeError(Exception):
"""年龄无效异常"""
def __init__(self, age):
super().__init__(f"无效年龄:{age} (必须为 0-150)")
def set_age(age):
if not 0 <= age <= 150:
raise InvalidAgeError(age)
print(f"年龄设置为:{age}")
try:
set_age(200)
except InvalidAgeError as e:
print(e) # 输出:无效年龄:200 (必须为 0-150)