# GESP等级：四级 | GESP Python 四级考点
"""
实操练习：try-except 捕获异常
课程时间：40:00-55:00

【使用说明】
1. 每个练习都是独立的函数，包含 TODO 注释
2. 阅读题目，在 TODO 下方编写代码
3. 运行本文件测试你的代码
4. 参考答案在文件末尾的 test_solutions() 中
"""

import sys


def exercise_1_catch_value_error():
    """
    练习1：捕获 ValueError

    题目：用户输入一个整数，用 int() 转换。
    如果输入的不是有效整数，打印"输入无效，请输入整数"。
    如果转换成功，打印"输入的数字是: X"。

    要求：只捕获 ValueError，不捕获其他异常。
    """
    user_input = input("(练习1) 请输入一个整数: ")

    # TODO: 在此处编写 try-except 代码


def exercise_2_catch_zero_division():
    """
    练习2：捕获 ZeroDivisionError

    题目：计算 100 / n，其中 n 由用户输入。
    如果 n 为 0，打印"除数不能为 0"。
    如果 n 不是整数，打印"请输入整数"。
    如果计算成功，打印"100 / n = 结果"。

    提示：需要先处理 ValueError（int()转换），再处理 ZeroDivisionError（除法）
    """
    user_input = input("(练习2) 请输入除数: ")

    # TODO: 在此处编写 try-except 代码


def exercise_3_protect_calculator():
    """
    练习3：保护计算器

    题目：编写一个简单的"除法计算器"。
    要求用户输入被除数和除数。
    如果输入不是数字，重新提示直到输入正确。
    如果是除零错误，提示"除数不能为0"并让用户重新输入除数。

    提示：使用 while 循环 + try-except
    """
    print("(练习3) 除法计算器")

    # TODO: 在此处编写完整计算器逻辑

    # result = a / b
    # print(f"结果: {a} / {b} = {result}")


def exercise_4_process_list():
    """
    练习4：安全处理列表

    题目：有一个列表 data = [10, 20, 30, 0, 50]
    用一个循环遍历，计算 100 / 每个元素。
    遇到 ZeroDivisionError 时，打印"跳过元素 {值}，除零错误"。
    遇到 TypeError 时，打印"跳过元素 {值}，类型错误"。
    无论是否出错，最终都需要统计：
      - 成功处理了多少个
      - 共多少个元素

    提示：用 else 统计成功次数，用 finally 或循环外打印结果
    """
    data = [10, 20, 30, 0, 50]

    # TODO: 在此处编写处理代码


# ======================================================
# 测试运行
# ======================================================

if __name__ == "__main__":
    print("\n" + "=" * 50)
    print("Python try-except 实操练习")
    print("=" * 50)
    print("请先完成各练习的 TODO 部分")
    print("然后运行本文件进行测试\n")

    # 选择要运行的练习
    exercises = {
        "1": exercise_1_catch_value_error,
        "2": exercise_2_catch_zero_division,
        "3": exercise_3_protect_calculator,
        "4": exercise_4_process_list,
    }

    if len(sys.argv) > 1:
        ex_num = sys.argv[1]
        if ex_num in exercises:
            exercises[ex_num]()
        else:
            print(f"未知练习编号: {ex_num}")
    else:
        print("指定练习参数运行，例如:")
        print("  python practice_exercises.py 1  # 运行练习1")
        print("  python practice_exercises.py 2  # 运行练习2")


# ======================================================
# 参考答案（学完后再看！）
# ======================================================

def test_solutions():
    """参考答案——运行这个函数查看标准实现"""
    print("\n--- 练习1 参考答案 ---")

    def sol_ex1():
        user_input = "abc"  # 模拟输入
        try:
            n = int(user_input)
            print(f"输入的数字是: {n}")
        except ValueError:
            print("输入无效，请输入整数")

    sol_ex1()

    print("\n--- 练习2 参考答案 ---")

    def sol_ex2():
        user_input = "0"  # 模拟输入
        try:
            n = int(user_input)
            try:
                result = 100 / n
                print(f"100 / {n} = {result}")
            except ZeroDivisionError:
                print("除数不能为 0")
        except ValueError:
            print("请输入整数")

    sol_ex2()

    print("\n--- 练习3 参考答案 ---")

    def sol_ex3():
        while True:
            try:
                a = int(input("被除数: "))
                break
            except ValueError:
                print("× 无效输入，请重新输入")

        while True:
            try:
                b = int(input("除数: "))
                result = a / b
                break
            except ValueError:
                print("× 无效输入，请重新输入")
            except ZeroDivisionError:
                print("× 除数不能为 0，请重新输入")

        print(f"结果: {a} / {b} = {result}")

    print("（需要交互输入，跳过自动演示）")

    print("\n--- 练习4 参考答案 ---")

    def sol_ex4():
        data = [10, 20, 30, 0, 50]
        success_count = 0
        total = len(data)

        for item in data:
            try:
                result = 100 / item
            except ZeroDivisionError:
                print(f"跳过元素 {item}，除零错误")
            except TypeError:
                print(f"跳过元素 {item}，类型错误")
            else:
                success_count += 1
                print(f"100 / {item} = {result}")

        print(f"\n统计：成功 {success_count} / 总数 {total}")

    sol_ex4()
