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

87 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Day_10 · 异常处理:程序不崩溃的"安全网"
> 预计耗时: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
# 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}")
```