- 时长: 90 分钟
- 教学目标:
- 理解程序在运行过程中可能出现的“错误”(在 Python 中叫做“异常”)。
- 知道为什么我们需要处理这些错误,让程序更健壮、对用户更友好。
- 学习
try...except
语句的基本语法,用来“尝试”执行一段代码,并在出错时“捕获”错误。 - 学会捕获不同类型的错误(比如用户输入不是数字、文件找不到、字典里没有这个键)。
- 理解
try...except
代码块的执行流程。 - 能够为常见的可能出错的代码添加错误处理,防止程序意外停止。
课程内容
1. 复习与引入 (10 分钟)
- 复习: 快速回顾元组和集合的特点和用法,以及它们与列表和字典的区别。
- 提出问题: 老师提问:“我们写了很多程序了,有时候程序运行得好好的,但有时候运行到一半就突然停下来了,还出现红色的英文提示,你们遇到过吗?比如,我们让用户输入数字,用户却输入了文字,程序就会报错;我们尝试打开一个文件,但那个文件根本不存在,程序也会报错;我们用键去字典里找值,但字典里没有这个键,程序又会报错。”
- 引出错误处理: 这些突然停下来的情况,就是程序遇到了“错误”(更专业的说法是“异常”)。对于用户来说,程序突然停下来是很糟糕的体验。一个好的程序应该能预测到这些可能发生的错误,并在错误发生时,不是直接崩溃,而是给用户一个友好的提示,或者尝试做一些补救措施。这叫做错误处理。
2. 什么是错误(异常)?为什么要处理它们? (15 分钟)
- 概念: 错误(异常)是在程序运行过程中发生的特殊事件,它中断了程序正常的执行流程。比如:
ValueError
: 值错误,比如把文字转换为数字时,文字不是有效的数字。TypeError
: 类型错误,比如尝试把数字和列表相加。ZeroDivisionError
: 除零错误,比如计算10 / 0
。NameError
: 名称错误,使用了没有定义过的变量。IndexError
: 索引错误,访问列表、元组、字符串时使用了不存在的索引。KeyError
: 键错误,访问字典时使用了不存在的键。FileNotFoundError
: 文件未找到错误,要打开的文件不存在。
- 为什么要处理错误?
- 防止程序崩溃: 最直接的好处是程序不会因为一个小问题就完全停止运行。
- 提升用户体验: 用户看到的是友好的提示(“请输入有效的数字”),而不是一堆看不懂的红色错误信息。
- 让程序更稳定: 即使在 unexpected 的情况下,程序也能保持运行或以可控的方式退出。
- 方便调试: 我们可以根据捕获到的错误信息,知道问题出在哪里。
3. 尝试做… 如果出错就捕获 – try…except (20 分钟)
- 基本思想: 使用
try...except
语句,告诉 Python:“你先‘尝试’执行这段代码,如果执行过程中没有出错,就太好了;但如果在这段代码里发生了错误,不要崩溃,而是跳到except
后面的代码块里去执行错误处理的代码。” - 语法:
try: # 这里放你“尝试”执行的、可能会出错的代码 print("尝试执行可能会出错的代码...") # 示例:可能会出错的除法 result = 10 / 0 # 这行会引发 ZeroDivisionError print("这行代码在出错后不会执行") # 如果上面一行出错,这行会被跳过 except: # 如果 try 块里的代码出错了,就执行这里的代码 # 这里写错误处理的代码 print("啊哈!出错啦!") print("程序会继续往下运行。") # try-except 块后面的代码,无论是否出错都会执行 print("程序到这里了。")
- 执行流程:
- 程序先进入
try
块,执行里面的代码。 - 如果在
try
块执行过程中没有发生任何错误,那么except
块里面的代码会被完全跳过,程序接着执行try-except
块后面的代码。 - 如果在
try
块执行过程中发生了错误,程序会立即停止执行try
块中出错点后面的代码,跳到对应的except
块中执行错误处理代码,然后接着执行try-except
块后面的代码。
- 程序先进入
- 演示: 老师演示一个会引起
ZeroDivisionError
的代码,先不加try-except
,让学生看程序崩溃。 然后加上try-except
,再次运行,让学生看程序捕获错误并继续运行。 - 动手实践: 学生编写一个简单的除法程序,故意让除数是 0,然后用
try-except
捕获错误,打印“除数不能为零!”的提示。
4. 捕获不同类型的错误 (20 分钟)
- 捕获所有错误: 只写
except:
可以捕获任何类型的错误,但这样不太好,因为我们不知道具体是什么错误。 - 捕获特定错误: 在
except
后面指定要捕获的错误类型。try: num_str = input("请输入一个数字:") num = int(num_str) # 如果输入的不是数字,这里会引发 ValueError result = 10 / num # 如果输入的数字是 0,这里会引发 ZeroDivisionError print("计算结果是:", result) except ValueError: # 只捕获 ValueError print("输入错误:您输入的不是一个有效的数字!") except ZeroDivisionError: # 只捕获 ZeroDivisionError print("计算错误:除数不能为零!") except: # 捕获上面没有指定的其他所有错误 print("发生了其他类型的错误!") print("程序继续。")
- 获取错误信息: 可以在
except
后面加上as 变量名
,将错误对象存储到一个变量里,方便打印错误信息或进行更详细的处理。try: my_dict = {"a": 1, "b": 2} print(my_dict["c"]) # 这里会引发 KeyError except KeyError as e: # 捕获 KeyError,并将错误对象赋值给变量 e print(f"字典错误:找不到键 {e}") # 错误对象 e 会包含键的信息 except Exception as e: # Exception 可以捕获大多数常见的错误 print(f"发生了其他错误:{e}") # 打印错误信息
- 演示: 老师演示如何捕获
ValueError
(输入非数字),KeyError
(访问不存在的字典键),FileNotFoundError
(打开不存在的文件),并分别打印不同的提示信息。 - 动手实践: 学生编写程序,让用户输入一个数字,并将其转换为整数。使用
try-except ValueError
捕获错误,如果用户输入的不是数字,打印“请只输入整数!”。
5. 课堂练习 (15 分钟)
让学生独立完成以下练习:
- 练习 1: 编写一个程序,尝试打开一个叫做
non_existent_file.txt
的文件(这个文件不存在)。使用try-except FileNotFoundError
捕获错误,如果文件不存在,打印“错误:文件未找到!”。# 在这里写你的代码 file_name = "non_existent_file.txt" try: # TODO: 尝试以读取模式打开文件 # TODO: 如果成功打开 (不会执行 except 块),可以打印一句成功的提示,或者读取内容 (但因为文件不存在,这里不会执行到) pass # 用 pass 占位 except FileNotFoundError: # TODO: 捕获 FileNotFoundError,打印错误信息 pass
- 练习 2: 编写一个程序,有一个字典
student_grades = {"小明": 90, "小红": 85}
。让用户输入一个学生名字,尝试打印这个学生的分数。使用try-except KeyError
捕获错误,如果输入的学生名字不在字典中,打印“字典中没有找到这个学生。” - 练习 3: 编写一个程序,让用户输入两个数字。尝试将它们转换为浮点数,并计算第一个数除以第二个数的结果。使用
try-except
捕获可能的ValueError
和ZeroDivisionError
,分别打印不同的错误提示。
6. 总结与提问 (5 分钟)
- 回顾: 回顾本节课内容:什么是异常,为什么处理异常,
try...except
语句的基本用法,如何捕获特定类型的异常,如何使用as
获取错误信息,以及try-except
的执行流程。 - 提问:
- 程序运行时出错叫做什么?
- 为什么要使用
try...except
? try
块里的代码什么时候会执行?except
块里的代码什么时候会执行?except ValueError:
是捕获什么错误?- 如何获取错误的具体信息并打印出来?
- 答疑: 回答学生问题。
7. 布置课后作业 (5 分钟)
- 作业 1: 编写一个程序,让用户输入一个整数的索引。尝试从一个固定列表(例如
my_list = [10, 20, 30, 40, 50]
) 中获取该索引对应的元素并打印。使用try-except ValueError
(如果用户输入不是整数)和try-except IndexError
(如果索引超出范围)捕获错误,并打印相应的错误提示。 - 作业 2: 编写一个程序,从一个叫做
settings.txt
的文件中读取内容(这个文件可能不存在)。如果文件不存在,使用try-except
捕获错误,并创建一个新的settings.txt
文件,往里面写入一行默认内容:“language: en”。如果文件存在,则读取并打印文件内容。 - 作业 3: (选做) 编写一个函数
safe_divide(num1, num2)
,接收两个参数。在函数内部使用try-except
捕获ZeroDivisionError
。如果除法成功,返回结果;如果发生除零错误,打印错误提示并返回None
。在主程序中调用这个函数并打印返回值。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)