Add Day_10: 异常处理
This commit is contained in:
@@ -0,0 +1,86 @@
|
|||||||
|
# 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}")
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user