diff --git a/Day_10/README.md b/Day_10/README.md new file mode 100644 index 0000000..5927920 --- /dev/null +++ b/Day_10/README.md @@ -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}") +```