# GESP等级：四级 | GESP Python 四级考点
"""
演示4：多分支 except 与 try-except 嵌套
课程时间：30:00-40:00（进阶）
焦点：精细化异常处理
"""

print("=" * 60)
print("示例1：多分支 except —— 不同异常不同处理")
print("=" * 60)


def divide_numbers():
    """
    安全的除法运算
    针对 ValueError 和 ZeroDivisionError 给出不同的错误提示
    """
    try:
        a = int(input("请输入被除数: "))
        b = int(input("请输入除数: "))
        result = a / b
    except ValueError:
        print("× 错误：请输入有效的整数！")
        return  # 遇到错误提前返回
    except ZeroDivisionError:
        print("× 错误：除数不能为 0！")
        return

    # 只有没有异常时才会执行到这里
    print(f"✓ 计算结果: {a} ÷ {b} = {result:.2f}")


# 运行三次，分别测试不同场景
for i in range(3):
    print(f"\n--- 第 {i + 1} 次调用 ---")
    divide_numbers()

print("\n\n")
print("=" * 60)
print("示例2：try-except 嵌套 —— 外层兜底")
print("=" * 60)


def nested_try():
    """
    外层 try 处理整体流程，内层 try 处理细节异常
    真实场景：从文件读取配置并计算的模拟
    """
    try:
        print("【外层 try】开始执行完整流程...")

        # 内层 try：处理用户输入
        try:
            raw = input("(内层) 请输入一个数字: ")
            num = int(raw)
        except ValueError:
            print("(内层) 输入转换失败，使用默认值 1")
            num = 1

        # 内层 try：处理除法运算
        try:
            result = 100 / num
            print(f"(内层) 计算结果: 100 / {num} = {result}")
        except ZeroDivisionError:
            print("(内层) 除零错误，结果设为无穷大")
            result = float("inf")

        print("【外层 try】流程完整执行完毕")

    except Exception as e:  # 外层兜底：捕获所有意外异常
        print(f"【外层 except】未知错误: {type(e).__name__}: {e}")


nested_try()

print("\n\n")
print("=" * 60)
print("示例3：try-except-else-finally 完整结构")
print("=" * 60)


def complete_structure():
    """
    完整 try 结构：
    try      → 执行可能出错的代码
    except   → 出错时执行
    else     → 没出错时执行
    finally  → 无论如何都执行（清理资源）
    """
    try:
        num = int(input("请输入一个数字: "))
        result = 100 / num
    except ValueError:
        print("× [except] 输入的不是有效数字")
    except ZeroDivisionError:
        print("× [except] 除数不能为 0")
    else:
        # 没有异常时执行
        print(f"✓ [else] 计算成功: 100 / {num} = {result:.2f}")
    finally:
        # 无论是否异常都会执行
        print("✓ [finally] 清理工作：关闭资源、释放连接等")


print("\n测试1 —— 输入有效数字（触发 else）")
complete_structure()

print("\n测试2 —— 输入非数字（触发 except + finally）")
# 模拟测试时不阻塞，直接传值
# 实际运行时需手动输入
