91 lines
2.8 KiB
Python
91 lines
2.8 KiB
Python
# 第 2-3 课完整示例:异常处理
|
|
#
|
|
# 本程序通过固定测试数据演示异常处理,不会要求用户输入。
|
|
# 文件示例只会读取当前课程目录中的 example_data 文件夹。
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
LESSON_DIR = Path(__file__).parent
|
|
DATA_DIR = LESSON_DIR / "example_data"
|
|
CONFIG_FILE = DATA_DIR / "agent_count.txt"
|
|
|
|
|
|
def parse_positive_integer(number_text):
|
|
"""把文本转换为正整数,失败时返回 None。"""
|
|
try:
|
|
number = int(number_text)
|
|
except ValueError:
|
|
# ValueError 表示值的内容不符合转换要求。
|
|
print(f"“{number_text}”不是有效整数。")
|
|
return None
|
|
|
|
if number <= 0:
|
|
print("数字必须大于 0。")
|
|
return None
|
|
|
|
return number
|
|
|
|
|
|
def divide_tool_count(tool_count, agent_count):
|
|
"""计算平均工具数量,除数为零时返回 None。"""
|
|
try:
|
|
average = tool_count / agent_count
|
|
except ZeroDivisionError:
|
|
# ZeroDivisionError 表示程序尝试用数字除以零。
|
|
print("Agent 数量不能为 0。")
|
|
return None
|
|
else:
|
|
# 只有 try 中没有发生异常时,才会执行 else。
|
|
return average
|
|
|
|
|
|
def read_agent_count(file_path):
|
|
"""读取文件中的 Agent 数量,并保证输出结束提示。"""
|
|
try:
|
|
content = file_path.read_text(encoding="utf-8")
|
|
return int(content.strip())
|
|
except FileNotFoundError:
|
|
print(f"没有找到文件:{file_path.name}")
|
|
except ValueError:
|
|
print(f"{file_path.name} 中保存的不是有效整数。")
|
|
finally:
|
|
# 无论是否发生异常,finally 都会执行。
|
|
print(f"已完成对 {file_path.name} 的读取尝试。")
|
|
|
|
return None
|
|
|
|
|
|
def prepare_example_file():
|
|
"""在课程专用目录中准备安全的示例文件。"""
|
|
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
|
CONFIG_FILE.write_text("3\n", encoding="utf-8")
|
|
|
|
|
|
def main():
|
|
"""依次运行整数转换、除法和文件读取示例。"""
|
|
print("一、处理整数转换异常")
|
|
valid_number = parse_positive_integer("5")
|
|
invalid_number = parse_positive_integer("五")
|
|
print(f"有效结果:{valid_number}")
|
|
print(f"无效结果:{invalid_number}")
|
|
|
|
print("=" * 30)
|
|
print("二、处理除以零异常")
|
|
average = divide_tool_count(6, 3)
|
|
failed_average = divide_tool_count(6, 0)
|
|
print(f"正常结果:{average}")
|
|
print(f"异常结果:{failed_average}")
|
|
|
|
print("=" * 30)
|
|
print("三、处理文件读取异常")
|
|
prepare_example_file()
|
|
agent_count = read_agent_count(CONFIG_FILE)
|
|
missing_count = read_agent_count(DATA_DIR / "missing.txt")
|
|
print(f"文件中的 Agent 数量:{agent_count}")
|
|
print(f"不存在文件的读取结果:{missing_count}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|