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

Open
opened 2026-08-22 17:26:36 +08:00 by shimmer · 31 comments
Owner

题目与教程详见仓库对应目录 Day_10/README.md(本仓库已克隆即得)。

预计耗时: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 代码贴在当日工单评论里。

参考解答(先做再看)

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

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}")
> 题目与教程详见仓库对应目录 Day_10/README.md(本仓库已克隆即得)。 > 预计耗时:20~30 分钟 > 用户输入的永远不可信——填错、乱填、不填,程序都不能崩。 > Django 校验参数、Celery 任务失败重试,核心都是今天学的 try/except。 ## 今日知识点 - `try: ... except 异常类型: ...`:把可能出错的代码放 try 里,出错就跳进 except - 常见异常:`ValueError`(值不对,如 `int("abc")`)、`ZeroDivisionError`(除数为 0) - 技巧:先让程序崩一次,看报错最后一行写的什么异常类型,再捕获它 ## 先学(教程) - 菜鸟教程("Python3 错误和异常"一节):https://www.runoob.com/python3/python3-exceptions.html - B站黑马教程(看讲"异常"的几集):https://www.bilibili.com/video/BV1qW4y1a7fU/ ## 任务(后做) 新建 `day10.py`: 1. 捕获"输入不是数字"的异常: ```python try: num = int(input("请输入一个数字:")) print(f"你输入的是{num}") except ValueError: print("这不是数字!请重新运行并输入数字。") ``` 运行两次:一次输入 `123`,一次输入 `abc`,确认不崩溃且有提示。 2. 除法保护: ```python 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` 代码贴在当日工单评论里。 ## 参考解答(先做再看) ```python try: num = int(input("请输入一个数字:")) print(f"你输入的是{num}") except ValueError: print("这不是数字!") 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}") ```
image.png
<img width="1207" alt="image.png" src="attachments/95e72549-2c3f-4dfc-9443-d2d85acb0def">
174 KiB

image.png

![image.png](/attachments/9fa4710b-a252-42e2-8eea-36fbf10de47b)

image.png

![image.png](/attachments/83e7dcdc-81d9-4a8b-9d90-5c40305b7910)
192 KiB
image.png
<img width="817" alt="image.png" src="attachments/b2ee6fd7-09bc-427f-9e31-db1a311aa2a8">
image.png
<img width="527" alt="image.png" src="attachments/2978c54c-d2a3-4c63-894b-5f80e2956e3b">
147 KiB
179ca742bed507fe36c30a02b30c4f80.png
<img width="1190" alt="179ca742bed507fe36c30a02b30c4f80.png" src="attachments/4fabecdb-6ced-4a98-9cbe-99c4782cafc6">
![image.png](/attachments/e3db4e63-209f-40ce-9415-41f55f137b8e) https://github.com/wyn-netizen/hello-daily-challenge
265 KiB
{1DC180A9-CF4B-4315-9E79-6398BA4F4E16}.png
<img width="672" alt="{1DC180A9-CF4B-4315-9E79-6398BA4F4E16}.png" src="attachments/545e1e4a-b7e9-4d00-888c-59ed3a50e9fc">
屏幕截图 2026-09-19 121616.png
<img width="1439" alt="屏幕截图 2026-09-19 121616.png" src="attachments/9c8e1cb0-fa28-44ad-87d3-6a0edac6b25e">
屏幕截图 2026-09-20 210726.png
<img width="1279" alt="屏幕截图 2026-09-20 210726.png" src="attachments/abc53900-9aac-4b63-871c-9afc64347dce">

QQ_1789963845180.png

![QQ_1789963845180.png](/attachments/12fbd8a2-2618-429f-a5b8-41a21d66a4a6)

image.png

try:
    num = int(input("请输入一个数字:"))
    print(f"你输入的是{num}")
except ValueError:
    print("这不是数字(int类型)!请重新运行并输入数字。")

try:
    a = int(input("被除数:"))
    b = int(input("除数:"))
    print(a / b)
except ValueError:
    print("请输入数字(int类型)!")
except ZeroDivisionError:
    print("除数不能为 0!")

def safe_int(prompt):
    try:
        return int(prompt)
    except ValueError:
        return None

num = safe_int(input("safe_int 函数:安全转换为int类型。请输入测试参数:"))
if num is None:
    print("输入的不是数字(int类型)!")
else:
    print(f"你输入的是{num}")
![image.png](/attachments/26fd9275-615e-4045-a4e5-1a0536153e76) ```python try: num = int(input("请输入一个数字:")) print(f"你输入的是{num}") except ValueError: print("这不是数字(int类型)!请重新运行并输入数字。") try: a = int(input("被除数:")) b = int(input("除数:")) print(a / b) except ValueError: print("请输入数字(int类型)!") except ZeroDivisionError: print("除数不能为 0!") def safe_int(prompt): try: return int(prompt) except ValueError: return None num = safe_int(input("safe_int 函数:安全转换为int类型。请输入测试参数:")) if num is None: print("输入的不是数字(int类型)!") else: print(f"你输入的是{num}") ```
300 KiB
image.png
<img width="1115" alt="image.png" src="attachments/3fc6e963-0e71-45ac-a461-5ed5e4eaa88e">
242 KiB
image.png
<img width="1428" alt="image.png" src="attachments/47893bbf-c1a6-452b-af3a-bff816ebaffd">
339 KiB
image.png
<img width="926" alt="image.png" src="attachments/e5decb23-43e9-47d0-847a-3ce99319db4f">
253 KiB
image.png
<img width="317" alt="image.png" src="attachments/1f991f25-110c-4c4c-bcbf-4382b457271e">
183 KiB

image.png

![image.png](/attachments/0f09e7cb-c574-47ae-ab05-d2bb43204ad0)
313 KiB
image.png
<img width="1152" alt="image.png" src="attachments/0ecd294c-b51d-424b-9663-388c36d37fc8">
244 KiB

image.png

![image.png](/attachments/c836110f-0596-45f2-8066-6eecaf0d1b71)
589 KiB

`try:
num=int(input("输入一个数字:"))
print(f"你输入了{num}")
except ValueError:
print("你输的不是数字")

try:
a=int(input("被除数"))
b=int(input("除数"))
print(a/b)
except ValueError:
print("请输入数字")
except ZeroDivisionError:
print("除数不能为0!")`

`try: num=int(input("输入一个数字:")) print(f"你输入了{num}") except ValueError: print("你输的不是数字") try: a=int(input("被除数")) b=int(input("除数")) print(a/b) except ValueError: print("请输入数字") except ZeroDivisionError: print("除数不能为0!")`

-image.png

-<img width="1280" alt="image.png" src="attachments/d84f527a-0c5f-4cfa-a549-236cbe1c7e4a">
368 KiB

Day_10 · 异常处理 try/except

输入 abc 被 ValueError 捕获、除数为 0 被 ZeroDivisionError 捕获,程序都没崩溃

day10.png

**Day_10 · 异常处理 try/except** 输入 abc 被 ValueError 捕获、除数为 0 被 ZeroDivisionError 捕获,程序都没崩溃 ![day10.png](https://cdn.jsdelivr.net/gh/xu675693517-hue/hello-daily-challenge@main/screenshots/day10.png)

image.png

![image.png](/attachments/04db12dd-d936-4b3f-902a-0bb479e09c22)
Sign in to join this conversation.