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:
- 捕获"输入不是数字"的异常:
运行两次:一次输入
try: num = int(input("请输入一个数字:")) print(f"你输入的是{num}") except ValueError: print("这不是数字!请重新运行并输入数字。")123,一次输入abc,确认不崩溃且有提示。 - 除法保护:
测试:
try: a = int(input("被除数:")) b = int(input("除数:")) print(a / b) except ValueError: print("请输入数字!") except ZeroDivisionError: print("除数不能为 0!")10 / 2、10 / 0、abc / 2三种情况。 - 进阶(加分):写一个通用函数
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}")