• 时长: 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("程序到这里了。")
    
  • 执行流程:
    1. 程序先进入 try 块,执行里面的代码。
    2. 如果在 try 块执行过程中没有发生任何错误,那么 except 块里面的代码会被完全跳过,程序接着执行 try-except 块后面的代码。
    3. 如果在 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 捕获可能的 ValueErrorZeroDivisionError,分别打印不同的错误提示。

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。在主程序中调用这个函数并打印返回值。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。