def divide(a, b): if b == 0: raise ValueError("除数不能为零!") # 主动抛出异常 return a / btry: divide(10, 0)except ValueError as e: print(e)
什么时候用 raise?
参数不合法时
业务逻辑出错时
把底层异常包装成更有意义的异常
17.7 自定义异常
自己定义异常类型,继承 Exception。
示例
class AgeError(Exception): """年龄异常""" passdef set_age(age): if age < 0 or age > 150: raise AgeError(f"年龄不合法:{age}") print(f"设置年龄为:{age}")try: set_age(200)except AgeError as e: print(e)
带自定义信息的异常
class MyError(Exception): def __init__(self, message, code): super().__init__(message) self.code = codetry: raise MyError("出错了", 500)except MyError as e: print(f"错误信息:{e}") print(f"错误代码:{e.code}")
# ❌ 不好:用异常判断key是否存在try: value = d[key]except KeyError: value = default# ✅ 好:用get方法value = d.get(key, default)
4. 资源清理用 finally 或 with
# 文件操作推荐用 withwith open("file.txt", "r") as f: content = f.read()
17.9 常见异常场景
1. 用户输入处理
while True: try: age = int(input("请输入年龄:")) if age < 0 or age > 150: raise ValueError("年龄不在合理范围") break except ValueError as e: print(f"输入无效:{e},请重新输入")print(f"你的年龄是:{age}")
2. 文件操作
try: with open("data.txt", "r", encoding="utf-8") as f: data = f.read()except FileNotFoundError: print("文件不存在,使用默认数据") data = "默认数据"except PermissionError: print("没有权限读取文件")except Exception as e: print(f"读取文件出错:{e}")
3. 字典取值
d = {"name": "Tom", "age": 18}# 方式1:用get(推荐)age = d.get("age", 0)# 方式2:用异常(不推荐,性能差)try: age = d["age"]except KeyError: age = 0