# GESP等级：四级 | GESP Python 四级考点
"""
快速参考：try-except 速查表

可以作为模块导入，快速回忆语法
"""

# ==================== 基本结构 ====================

# 结构1：try-except（基本款）
"""
try:
    可能出错的代码
except:
    出错时执行的代码
"""

# 结构2：捕获指定异常
"""
try:
    n = int(input("数字: "))
except ValueError:
    print("请输入数字")
"""

# 结构3：捕获多种异常（多分支）
"""
try:
    a = int(input("被除数: "))
    b = int(input("除数: "))
    r = a / b
except ValueError:
    print("请输入有效整数")
except ZeroDivisionError:
    print("除数不能为 0")
"""

# 结构4：捕获多种异常（单行元组）
"""
try:
    r = 100 / int(x)
except (ValueError, ZeroDivisionError) as e:
    print(f"出错: {e}")
"""

# 结构5：try-except-else-finally（完整版）
"""
try:
    可能出错的代码
except SomeError:
    出错时执行
else:
    没出错时执行（可选）
finally:
    无论是否出错都执行（可选）
"""


# ==================== 错误类型三分类 ====================

"""
⭐ 程序出错的三种类型

① 语法错误（SyntaxError）
   代码没按Python语法写 → 还没运行就报错
   例: print("hello"   ← 少了右括号
   例: if True          ← 少了冒号
   记忆: "说错话了"  🤭

② 运行时错误 / 异常（RuntimeError / Exception）
   语法对，但运行时出问题 → try-except 可以捕获！
   例: int("abc")    → ValueError
   例: 10 / 0        → ZeroDivisionError
   例: print(x)      → NameError （x未定义）
   记忆: "半路摔跤了"  🤕

③ 逻辑错误（Logic Error）
   代码能跑完，但结果不对 → try-except 不能捕获！靠 debug
   例: 面积 = π × r × 2  （应该是 r²）
   例: if x > 100 and x < 100  （永远不可能满足）
   记忆: "做错了事"  🤔
"""


# ==================== 常见异常 ====================

COMMON_EXCEPTIONS = {
    "ValueError": "值错误 —— int('abc'), float('xyz')",
    "TypeError": "类型错误 —— '1' + 2, len(123)",
    "NameError": "名称错误 —— 使用未定义变量",
    "ZeroDivisionError": "除零错误 —— 10 / 0",
    "IndexError": "索引越界 —— [1,2,3][100]",
    "KeyError": "键错误 —— {'a':1}['b']",
    "FileNotFoundError": "文件不存在 —— open('nope.txt')",
}


# ==================== 模板代码 ====================


def input_int_safe(prompt: str) -> int:
    """安全获取整数的通用模板"""
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print("× 请输入有效整数")


def divide_safe(a: int, b: int) -> float | None:
    """安全除法，返回 None 表示出错"""
    try:
        return a / b
    except ZeroDivisionError:
        print("× 除数不能为 0")
        return None


def print_help():
    """打印全部语法速查"""
    print("===== try-except 速查表 =====")

    print("\n--- 常用结构 ---")
    for name, code in {
        "基本": "try: ...\nexcept: ...",
        "指定类型": "try: ...\nexcept ValueError: ...",
        "多分支": "try: ...\nexcept ValueError: ...\nexcept ZeroDivisionError: ...",
        "完整版": "try: ...\nexcept: ...\nelse: ...\nfinally: ...",
    }.items():
        print(f"  {name}: {code}")

    print("\n--- 常见异常 ---")
    for name, desc in COMMON_EXCEPTIONS.items():
        print(f"  {name:20s} {desc}")

    print("\n--- 记忆钩子 ---")
    print("  try = 试一下, except = 出错了怎么办")


if __name__ == "__main__":
    print_help()
