Files
DailyChallenge_ProgrammingD…/Day_10/README.md
T
2026-08-22 01:09:33 +08:00

2.6 KiB
Raw Blame History

Day_10 · 异常处理:程序不崩溃的"安全网"

预计耗时:20~30 分钟 用户输入的永远不可信——填错、乱填、不填,程序都不能崩。 Django 校验参数、Celery 任务失败重试,核心都是今天学的 try/except。

今日知识点

  • try: ... except 异常类型: ...:把可能出错的代码放 try 里,出错就跳进 except
  • 常见异常:ValueError(值不对,如 int("abc"))、ZeroDivisionError(除数为 0)
  • 技巧:先让程序崩一次,看报错最后一行写的什么异常类型,再捕获它

先学(教程)

任务(后做)

新建 day10.py:

  1. 捕获"输入不是数字"的异常:
    try:
        num = int(input("请输入一个数字:"))
        print(f"你输入的是{num}")
    except ValueError:
        print("这不是数字!请重新运行并输入数字。")
    
    运行两次:一次输入 123,一次输入 abc,确认不崩溃且有提示。
  2. 除法保护:
    try:
        a = int(input("被除数:"))
        b = int(input("除数:"))
        print(a / b)
    except ValueError:
        print("请输入数字!")
    except ZeroDivisionError:
        print("除数不能为 0!")
    
    测试:10 / 2、10 / 0、abc / 2 三种情况。
  3. 进阶(加分):写一个通用函数 safe_int(s),能转就返回整数,不能转就返回 None, 再用它处理输入(num = safe_int(input(...)),if num is None: 打印提示)。

完成标准

  • 任务 1、2 的三种情况都不崩溃,提示清晰
  • 能说出 int("abc") 会抛什么异常
  • (进阶)safe_int 返回 None 而不是报错

提交方式:把 day10.py 代码贴在当日工单评论里。

参考解答(先做再看)

# 1. 数字校验
try:
    num = int(input("请输入一个数字:"))
    print(f"你输入的是{num}")
except ValueError:
    print("这不是数字!")

# 2. 除法保护
try:
    a = int(input("被除数:"))
    b = int(input("除数:"))
    print(a / b)
except ValueError:
    print("请输入数字!")
except ZeroDivisionError:
    print("除数不能为 0!")

# 进阶
def safe_int(s):
    try:
        return int(s)
    except ValueError:
        return None

num = safe_int(input("请输入一个数字:"))
if num is None:
    print("这不是数字!")
else:
    print(f"你输入的是{num}")