python闭关100天Day 12 学习任务:让程序更健壮 – 异常处理

内容分享2小时前发布
0 0 0

今日目标:

  1. 理解什么是异常以及为什么需要处理异常。
  2. 学习使用try-except块捕获和处理异常。
  3. 学习使用else和finally子句。
  4. 了解常见的异常类型。
  5. 学习如何抛出异常(使用raise)。

第一部分:为什么需要异常处理?

在程序运行过程中,可能会遇到各种错误,列如:

  • 文件不存在
  • 除以零
  • 类型错误
  • 索引越界

如果没有异常处理,这些错误会导致程序崩溃。异常处理可以让程序在遇到错误时优雅地处理,而不是直接崩溃。

  1. 异常示例:
# 创建新文件 day12_exception.py

# 除以零错误
# result = 10 / 0  # 这会引发ZeroDivisionError

# 文件不存在错误
# file = open('nonexistent.txt', 'r')  # 会引发FileNotFoundError

# 类型错误
# number = int("abc")  # 会引发ValueError

第二部分:基本的异常处理

2 使用try-except块:

# 捕获特定异常
try:
    number = int(input("请输入一个整数:"))
    result = 10 / number
    print(f"10除以{number}的结果是:{result}")
except ZeroDivisionError:
    print("错误:除数不能为零!")
except ValueError:
    print("错误:请输入一个有效的整数!")

3 捕获多个异常:

# 使用不指定异常类型的except可以捕获所有异常,但不推荐
try:
    # 可能出错的代码
    number = int(input("请输入一个整数:"))
    result = 10 / number
except:
    print("发生了某种错误!")

4 捕获所有异常:

# 使用不指定异常类型的except可以捕获所有异常,但不推荐
try:
    # 可能出错的代码
    number = int(input("请输入一个整数:"))
    result = 10 / number
except:
    print("发生了某种错误!")

第三部分:else和finally子句

5 else子句:

# 如果没有发生异常,则执行else块
try:
    number = int(input("请输入一个整数:"))
    result = 10 / number
except (ZeroDivisionError, ValueError):
    print("输入有误!")
else:
    print(f"计算成功,结果是:{result}")

6 finally子句:

# 无论是否发生异常,finally块都会执行
try:
    file = open('example.txt', 'r')
    content = file.read()
    number = int(content)
except (FileNotFoundError, ValueError) as e:
    print(f"错误:{e}")
finally:
    # 一般用于释放资源,如关闭文件
    if 'file' in locals():
        file.close()
    print("资源清理完成。")

第四部分:常见的异常类型

7 Python中常见的异常:

  • ZeroDivisionError:除以零
  • ValueError:值错误,如int('abc')
  • TypeError:类型错误,如 '2' + 2
  • IndexError:索引越界
  • KeyError:字典键不存在
  • FileNotFoundError:文件不存在
  • ImportError:导入模块失败
# 示例:处理多种常见异常
try:
    # 可能引发多种异常
    number = int(input("请输入一个整数:"))
    result = 10 / number
    my_list = [1, 2, 3]
    print(my_list[number])
except ZeroDivisionError:
    print("除数不能为零!")
except ValueError:
    print("请输入有效的整数!")
except IndexError:
    print("索引越界!")

第五部分:抛出异常

有时我们想主动抛出异常,可以使用raise语句。

8 使用raise抛出异常:

# 检查输入年龄的合理性
age = int(input("请输入年龄:"))
if age < 0 or age > 150:
    raise ValueError("年龄必须在0到150之间")
else:
    print(f"年龄是:{age}")

9 自定义异常:

# 创建自定义异常类
class MyCustomError(Exception):
    pass

# 使用自定义异常
def check_positive(number):
    if number < 0:
        raise MyCustomError("数字必须是正数")
    return number

try:
    check_positive(-5)
except MyCustomError as e:
    print(f"自定义错误:{e}")

第六部分:异常处理的最佳实践

10 异常处理的原则:

  • 只捕获你知道如何处理的异常
  • 避免使用空的except块(这会捕获所有异常,包括键盘中断等)
  • 尽量指定具体的异常类型
  • 使用finally块来释放资源
  • 在日志中记录异常信息,而不仅仅是打印
# 好的实践
try:
    # 可能出错的代码
    with open('data.txt', 'r') as file:
        data = file.read()
except FileNotFoundError:
    print("文件不存在,将使用默认数据")
    data = "默认数据"
except IOError as e:
    print(f"文件读取错误:{e}")
else:
    print("文件读取成功")

今日小结与练习

今日核心概念:

  • 异常: 程序运行过程中出现的错误
  • try-except: 捕获和处理异常
  • else: 没有异常时执行的代码
  • finally: 无论是否异常都会执行的代码,用于清理资源
  • raise: 主动抛出异常
  • 自定义异常: 创建自己的异常类

动手练习(务必完成):

练习1:安全的计算器
改善之前的计算器程序,添加异常处理,确保在输入无效时程序不会崩溃。

要求:

  • 处理除以零错误
  • 处理非数字输入错误
  • 让用户有机会重新输入,直到输入正确

示例:

请输入第一个数字:abc
错误:请输入有效的数字!
请输入第一个数字:10
请输入第二个数字:0
错误:除数不能为零!
请输入第二个数字:5
10 / 5 = 2

练习2:文件读取安全版
编写一个程序,要求用户输入文件名,然后读取文件内容。如果文件不存在,提示用户重新输入,直到输入有效的文件名。

示例:

请输入文件名:wrong.txt
文件不存在,请重新输入!
请输入文件名:example.txt
文件内容:...

练习3(挑战):用户注册验证
编写一个用户注册程序,要求用户输入用户名和密码,并进行验证:

  • 用户名长度至少3个字符
  • 密码长度至少8个字符
  • 如果验证失败,抛出自定义异常,并捕获显示给用户

示例:

请输入用户名:ab
错误:用户名必须至少3个字符!
请输入用户名:abc
请输入密码:123
错误:密码必须至少8个字符!

异常处理是编写健壮程序的关键,今天的内容超级重大。多练习,掌握各种异常处理技巧!

第十二天完成,你的程序目前更加健壮了!

© 版权声明

相关文章

暂无评论

none
暂无评论...